답변:
정규 표현식의 문제점은 정규 표현식 자체가 아니라 역 추적과 같은 모든 종류의 "편리한"기능을 가진 정규 표현식 엔진이라는 것입니다. 따라서 이러한 기능없이 정규식 엔진을 사용하면 피할 수 있습니다.
정규식 컴퓨터 과학 개념은 유한 상태 머신으로 컴파일 된 후 항상 선형 시간으로 일치시킬 수 있습니다. 따라서 상태 머신 기반 정규식 엔진을 ReDoS에 사용할 수 없습니다. 그러나 병리학 적 예에서 필요한 상태 기계가 다소 커질 수 있습니다. 그러나 사용 가능한 메모리를 제한하는 것은 사용 가능한 계산 시간을 제한하는 것보다 쉬운 경향이 있습니다.
RE2 엔진은 신뢰할 수없는 정규 표현식에 대처하기 위해 특별히 개발 된 선형 회 실행되도록 설계되었습니다.
다른 대안은 정규식을 간단한 표기법으로 조립하는 것입니다. 예를 들어 사용자가 글로브 패턴 (예 :)을 사용하도록 허용 할 수 있습니다 *.txt
. 그런 다음, 예를 들어 중첩을 허용하지 않고 탐욕스러운 수량자를 사용하여 역 추적을 방지하는 방식으로 구문 분석 할 수 있습니다. 많은 사용 사례에서 단순화 된 패턴 표기법만으로 충분합니다.
정규 표현식을 분석하여 분석 자체가 느려 지지 않고 느리게 진행되는지 여부를 확인 하면 정지 문제를 해결하는 데 도움이됩니다. 다시 말해, 정확하고 완전한 솔루션을 찾을 수 없습니다 .
당신은 물론, 정확하고있는 솔루션을 찾을 수 있습니다 에 완성. 예를 들어, 사용하기에 안전한 제한된 기능 목록 (예 : 문자 클래스 예, 반복 번호 ...)으로 작업 할 수 있습니다. 이를 통해 많은 중요하지 않은 정규 표현식을 전달하고 모든 중요한 규칙을 거부하며 자동으로 안전하지만 자동으로 증명하기에는 너무 잘못된 규칙을 잘못 거부 할 수 있습니다.
라자루스 프로젝트의 파서 작성자로서 주어진 정규 표현식에 대해 주어진 텍스트에서 어떤 리소스가 소비되는지 이해할 수있는 방법이 없다고 말하고 싶습니다.
동일한 자원을 소비하지 않으면 (적어도 큰 의미에서) 의미합니다.
따라서 가장 좋은 방법은 별도의 스레드에서 구문 분석기를 실행하고 시간 초과 후 종료하십시오.
다른 답변 외에도 솔루션은 자체 정규식 라이브러리를 롤링하여 실행 중에 성능 계측을 허용하므로 일부 기준이 충족되면 실행을 중간에 중단시킬 수있는 수단을 제공 할 수 있습니다.
마찬가지로 다른 스레드에서 정규식을 실행하고 너무 오래 걸리면 스레드를 종료 할 수 있습니다.