2010-03-03 3 views
5

정규 표현식을 테스트 할 수있는 웹 사이트를 만들고 싶습니다. 이미 많은 것들이 있습니다 (예 : http://www.pagecolumn.com/tool/pregtest.htm). 기본적으로 사용자는 정규식과 일부 샘플 텍스트를 제공하며 정규식 평가의 결과는 다시 나타납니다.PHP에서 사용자가 제공하는 정규 표현식의 위생 처리

PHP "preg_ *"함수를 사용하여 서버 측에서 정규식을 평가하고 싶습니다. 제공된 정규식을 위생 처리하는 방법이 있습니까? 염려해야하는 보안 취약점은 무엇입니까?

+0

왜 JS를 사용하지 않습니까? 이렇게하면 클라이언트 측에서 실행되므로 아무 것도 위생 할 필요가 없습니다. – Daan

+0

사용자 제공 샘플 텍스트에서 정규식을 평가하는 것 외에도 정규식을 서버에있는 "secret"문자열로 평가해야한다고 덧붙여 야합니다. 사용자가 문자열이 무엇인지 알지 못해 JS에서 그렇게하는 방법을 모르겠습니다. –

답변

3

PHP 자체가 정규식을 확인할 것이라고 생각합니다.

// check for input, and set max size of input 
if(@!empty($_POST['regex']) 
    && @!empty($_POST['text']) 
    && strlen($_POST['regex'])<1000 
    && strlen($_POST['text'])<2000 
    ){ 
    // set script timeout in case something goes wrong (SAFE MODE must be OFF) 
    $old_time=ini_get('max_execution_time'); 
    if(!set_time_limit(1)) die('SAFE MODE MUST BE OFF'); // 1 sec is more then enough 

    // trim input, it's up to you to do more checks 
    $regex=trim($_POST['regex']); 
    // don't trim the text, it can be needed 
    $input=$_POST['text']; 
    // escape slashes 
    $regex=preg_replace('/([\\/]+)?//', '\/', $regex); 

    // go for the regex 
    if([email protected]_match('/'.$regex.'/', $input, $matches)){ 
      // regex was tested, show results 
      echo 'Matches: '.$matched.'<br />'; 
      if($matched>0){ 
        echo 'matches: <br />'; 
        foreach($matches as $i => $match){ 
          echo $i.' = '.$match.'<br />'; 
       } 
      } 
    } 
    // set back original execution time 
    set_time_limit($old_time); 
} 

가 어쨌든, 가 NEVER EVER 사용자가 제출 문자열()로 평가 사용 여기에 내가 만든 샘플 스크립트입니다.

또한 최소한의 간단한 위생 처리를 수행 할 수 있지만 그게 당신에게 달린 것입니다. ;)

+1

대신에 정규식 문자열을 이스케이프 처리하는 대신 [preg_quote] (http://php.net/preg_quote)를 사용할 수 있습니다. – MarcDefiant

+0

max_execution_time을 설정하면 실제로 preg가 실행되는 시간이 제한됩니까?나는 DL 호출이 항상 완료된다는 인상하에 있었고, max_execution_time은 preg 호출이 반환 된 후에 PHP 스크립트 만 klill합니다. 즉, 사용자는 여전히 악의적 인 표현을 제공하여 시스템을 쉽게 습득 할 수 있습니다. – brightbyte

0

제가 생각할 수있는 유일한 문제는 누군가가 나쁜 정규 표현식 (O (2^n) 또는 O (n!) 또는 무엇이든)을 입력하여 DOS를 수행 할 수 있다는 것입니다. 그리고 이것을 막기위한 가장 쉬운 방법은 페이지 제한 시간을 짧게 설정하십시오.

+0

... 또는 PREG의 백 트레이스 레벨을 제한하십시오. – Xeoncross

0

정규 표현식을 데이터베이스에 저장하는 경우 준비된 명령문과 같이 데이터를 이스케이프 처리하는 데 일반적으로 사용하는 방법을 사용해야합니다.

그렇지 않으면 내 유일한 관심은 사용자가 mischeviously 복잡한 정규식을 포함 할 수 있다는 의미에서 악의적 인 정규식을 제공 할 수 있다는 것입니다. 그리고이를 확인하는 방법이 확실하지 않습니다.

한 가지 생각은 당신이 JS에서 그것을함으로써 모든 클라이언트 측에서 정규 표현식 평가자를 만들 수 있지만 php의 preg 함수와 JavaScript regex 함수 사이에 불일치가 있다는 것입니다.

0

Afaik 사용자 제공 regexps를 평가할 때 "취약성"이 있습니다. 어쩌면 일어날 수있는 최악의 경우는 - 에릭이 지적한 것처럼 - DOS 공격이거나 스크립트 내의 치명적인 오류입니다.

나는 이론적으로 가능한 모든 정규 표현식을 "위생적으로"만들 수 없다는 것을 두려워합니다. 당신이 할 수있는 최선은 어휘 및/또는 구문 오류를 검사하는 것입니다. 당신이 사용자가 제출 한 값을 허용하는 경우

1

preg_replace 당신이 e flag을 허용해야합니다! 그렇게하지 않으면 악의적 인 사용자가 전체 사이트를 삭제하거나 악화 될 수 있습니다.

그렇지 않으면 최악의 경우는 다른 답변이 이미 지적한 것입니다. 스크립트 시간 제한을 낮게 설정하십시오. 그러면 페이지를 분당 X 번만 호출 할 수도 있습니다.

관련 문제