2008-08-21 2 views
1

수석 고문을 위해 준비된 문을 사용하여 SQL 인젝션 취약점에 대한 수정을 자동으로 감지하고 제안하는 프로그램을 개발했습니다. 특히 PHP 용 mysqli 확장. SO 커뮤니티에 대한 제 질문은 다음과 같습니다. PHP 소스 코드에서 SQL을 감지하는 것이 바람직한 접근 방법은 무엇입니까?PHP 파일에서 SQL 구문을 분석하는 가장 좋은 방법은 무엇입니까?

기본적으로 SQL keywords (SELECT, INSERT, ...)을 포함하는 열거 형을 사용했으며 각 행을 기본적으로 구문 분석하여 열거 형을 반복하여 SQL이 있는지 판별했습니다. 또한, 나는 파서가 잘못 html을 (예 : < \ select>) 감지하지 않았는지 확인했다.

이 솔루션은 정상적으로 작동했지만 지금은 좀 더 시간을내어 코드를 리팩토링하여 좀 더 우아하고 효율적인 솔루션을 사용하려고했습니다. . 그게 내가 내 프로그램을 작성 무엇으로 C#을를 사용하여 솔루션을 제한

답변

1

귀하의 솔루션은 나에게 잘 보인다하시기 바랍니다. 다른 방법은 PHP 문법을 사용하여 Lex/Yacc 파서로 PHP 파일을 구문 분석하는 것입니다. Coco/R http://www.ssw.uni-linz.ac.at/coco/이라는 훌륭한 구문 분석 도구가 있습니다.

그러나 언어를 구문 분석하면 추가 결과없이 너무 많은 시간을 소비하게 될 것입니다 (개발 및 컴퓨팅).

나는 기회주의적인 접근법을 고수 하겠지만 다양한 PHP 코드에 대해 테스트하고 모든 가능한 경우를 다루기 위해 조정할 것입니다.

1

아마도 SQL92에 대해 BNF에 대해 텍스트 줄을 구문 분석하고 조각이 문법과 얼마나 일치하는지 각 줄에 점수를 매기는 데 약간의 차이가있을 수 있습니다.

소리가 다소 들리는군요. 당신의 간단한 접근 방식은 실제 사례의 많은 부분을 이미 잡을 것입니다. 당신이 용서 또는 PHP를 사용하여 저를 다운 투표를하지만 시간의 70 % 내 SQL 쿼리 이렇게

$sql = "SELECT * FROM table;"; 

같은 변수로 전환해야합니다 있도록

1

나는 C#에서 변수의 특성을 모르는 그 너머에 내가 가진 것을 향상시키기 위해 할 수있는 일은 생각할 수 없다.

몇 줄에 걸쳐 작성된 문장을 고려하고 문자열에 변수를 사용합니까? (아래 예) 당신이 용서 또는 PHP를 사용하여 저를 다운하는 투표를하지만 시간의 70 % 내 SQL 쿼리 변수로 전환해야합니다 있도록

$sql = "SELECT * FROM table WHERE fname = $fname OR snmae = $sname"; 
0

나는 C#에서 변수의 특성을 모르는 같은 그 가장명 무엇을 사용하기 때문에 그래서 ..

그래, 내 원래의 접근 방식은 단지 $의 SQL에 대한 바르보고했지만, 몇 PHP 애플리케이션에 대한 테스트 후 나는 빨리 좀 있기 때문에 해당 솔루션을 던졌다 개발자는 펑키 변수 이름을 사용합니다 ...

몇 줄에 걸쳐 작성된 문장을 고려하고 문자열에 변수를 사용합니까? (아래 예)

예프.또한 조건부로 생성 된 명령문을 처리하려고 시도했지만 항상 그렇게 잘 작동하지는 않았습니다. ;)

0

$ 스크립트를 가정 기능 (사용되는 모든 CRUD SQL 문을 감지하는 간단한 정규식은 전체 PHP 스크립트가)

preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?\)\s*?;/is', 
       $script, $matches); 

그것은 경우, DELETE 문, 가능한 모든 SELECT, INSERT, UPDATE 일치해야합니다 포함 그들은 괄호와 큰 따옴표 안에 위치합니다. 그것은 비 감각적이고 여러 줄에 걸쳐있는 문장에도 일치해야합니다.

편집 # 1 : 문자열 할당과 같은 CRUD 문과 일치하는 정규식;

preg_match_all('/\$\w+\s*?=\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?;/is', 
       $script, $matches); 

편집 # 2 :

// $variable detecting version of #1 regex 
preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?(?:\$\w+){1}.*?"\s*?\)\s*?;/is', 
        $script, $matches); 
1

나는 그것이 기능을 찾기 위해 가장 좋은 것입니다 말할 것 대신 SQL 자체를 찾는 호출합니다. PHP 파서를 수정하여 준비된 쿼리가 아닌 SQL 쿼리를 실행하는 함수 호출을 찾습니다.

관련 문제