대부분의 정규식 엔진은 입력을 평가할 때 백트래킹을 사용하여 정규식의 가능한 모든 실행 경로를 시도하는데, 경우에 따라 치명적인 백트래킹 상황이라고 하는 성능 문제를 일으킬 수 있습니다. 최악의 경우 정규식의 복잡성은 입력의 크기에 따라 기하급수적으로 증가하므로, 20자와 같이 신중하게 만들어진 작은 입력도 치명적인 백트래킹을 유발하여 애플리케이션의 서비스 거부를 일으킬 수 있습니다. 초선형 정규식의 복잡성은 신중하게 만들어진 큰 입력(수천 개의 문자)에서도 동일한 영향을 미칠 수 있습니다.
사용자 제어 입력에서 정규식 패턴을 구성하는 것은 권장하지 않으며, 다른 선택의 여지가 없는 경우 정규식 메타문자를 제거/소멸하기 위해 입력을 위생 처리하는 것이 좋습니다.
규칙을 어긴 코드
from flask import request
import re
@app.route('/upload')
def upload():
username = request.args.get('username')
filename = request.files.get('attachment').filename
re.search(username, filename) # 규칙을 어긴 코드
규칙을 준수한 해결책
from flask import request
import re
@app.route('/upload')
def upload():
username = re.escape(request.args.get('username'))
filename = request.files.get('attachment').filename
re.search(username, filename) # 규칙을 준수한 코드
같이보면 좋은 자료드
- OWASP Top 10 2021 Category A3 - 인젝션
- OWASP Top 10 2017 Category A1 - 인젝션
- MITRE, CWE-20 - 부적절한 입력 검증
- MITRE, CWE-400 - 제어되지 않는 리소스 소비
- MITRE, CWE-1333 - 비효율적인 정규식 복잡성
-
OWASP Regular expression Denial of Service - ReDoS
If you like SONARKUBE, don’t forget to give me a star.