2012-06-04 6 views
-3

SQL 주입 공격에 대한 체계적인 업그레이드와 보호를 원합니다. 나는 세 가지 주요 메소드가 pdo, prepared statements와 mysql_escape_string인데, pdo는 최상으로 간주되지만 mysql_escape_string은 당신이 세심한면 충분하다고 생각한다. 필자는 PDO로 갈 준비가되어 있지 않다고 생각합니다. 여러 테이블을 포함하는 많은 복잡한 쿼리를 처리 할 때 커다란 작업이 될 수 있습니다. 하지만 더 프로그래밍 방식으로 mysql_escape_string을 사용하고 싶습니다.PHP/MYSQL SQL 주입 공격 방지 기능

사용자가 제출 한 모든 개별 변수를 이스케이프 처리하지 않고 구두점을 처리하기 위해 수정이 필요한 표준 함수를 사용하여 SQL 명령을 이스케이프 처리하려고했습니다.이 방법이 건전한 접근인지 또는 전체 쿼리를 이스케이프 처리하여 문제를 만듭니다. 아포스트로피, 백틱 및 %를 사용하십시오. 모든 SQL 문에 대한 표준 함수는 변수 접근 방식에 의한 변수보다 체계적이고 표준적일 것입니다. 그렇다면 구두점을 처리하기위한 수정이 필요할 수 있습니다. 또한, htmlspecialchars 및 strip_tags와 같은 함수에 들어가야하는 것이 있습니까? mysql_escape_string이 100 % 완성되지 않았습니까?

다음은 기본 기능입니다.

function safe($sql) { 
$safesql = mysql_real_escape_string($sql); 
return $safesql; 
} 
+4

심각하게도 PDO 만 사용하십시오. 그것은 훨씬 덜 효과적이고 안전합니다. –

+1

그 또는 ActiveRecord \ Model – Eva

+0

@ user1260310 당신은 또한 보안/예방을위한보기 테이블을 만들 수 있습니다, 누군가가 SQL 주입이 제한됩니다. – jcho360

답변

3

난 내가 여러 테이블을 포함하는 복잡한 쿼리를 많이 가지고있는이 거대한 작업이 될 것이다, 그래서 PDO 또는 준비된 명령문에 갈 준비가 생각하지 않습니다.

거대한? 혹시. 그럴만 한 가치가있는 노력.

는 전체 쿼리가 문제

을 만들 탈출합니다. 당신의 함수는 SQL 조각이 주입 공격인지 또는 의도 한 것인지 알 수있는 방법이 없습니다.

은 에 삽입되는 지점에서 탈출해야합니다. SQL에 텍스트를 삽입 할 수 없으며 이후에 어떤 비트가 SQL이고 어느 비트가 텍스트인지를 파악할 수 없습니다.

는 아무것도 그 같은 반드시 htmlspecialchars로 함수에 가야한다고이 있고

strip_tags 멀리 데이터를 발생 strip_tags. 나는 그것을 사용하지 않을 것이다.

htmlspecialchars은 안전하지 않은 데이터가 HTML 문서에 삽입되는 것을 방지합니다. 데이터를 SQL에 삽입하기 전에 HTML 문서에 데이터를 삽입하기 전에이를 사용하십시오.

0

전체 쿼리와 작동시키는 유일한 방법은 자신의 SQL 구문 분석기를 작성한 후에도 마법을 사용하여 시도해야합니다. 을 참조하십시오. 쿼리의 일부는 SQL 주입입니다. 그렇게 할 수는 없습니다. 전체 쿼리를 한꺼번에 처리 할 수는 없습니다.

+0

마이크 B, SQL 인젝션이 포함되어 있는지 어떻게 하나의 쿼리에서 알 수 있습니까? –

+0

http://blog.php-security.org/archives/67-Heuristic-SQL-Injection-Detection-for-Suhosin.html .. 다시 권장하지는 않지만 확실히 가능합니다. OP가 처음으로 OP를 생각하지 않습니다. PHP에서부터 t-SQL에 이르기까지 SQL 인젝션을 중단하기 전에 많은 프로젝트가 집중되었습니다. 마술 따옴표를 올바르게 완료했다고 생각합니다. 불행히도 쉽지 않으며 항상 예외가 있습니다. –

+1

Mike B, 가장 일반적인 SQL 인젝션은 "OR"= "'암호 필드 안에"g3tz r00t "를 넣는 것입니다. 이것을 잡을 수 없다면 준비된 문장을 사용하는 것을 그만 두어도 좋습니다. * * 문제의 궁극적 인 해결책입니다 * –

0

그냥 명확히하기 위해 전체 쿼리에서 mysql_real_escape_string을 사용하지 말고 쿼리를 작성하는 데 사용하는 문자열 값만 사용해야합니다.

예 :

의 phpBB에서 사람이 쓴 나는 개인적으로 데시벨 수준처럼
"Select Id from table where username ='".mysql_real_escape_string($username)."' limit 1"; 
+0

위의 예제에서 나머지 쿼리를 이스케이프 처리하는 것에 대해 더 잘 이해할 수 있습니다. 예를 들어 username = '및 다음으로'1 '인 테이블에서 ID를 선택하십시오. $ username 주위에 아포스트로피를 유지할 방법이 없습니까? ? – user1260310

+1

나머지 쿼리를 이스케이프 처리하면 어떤 이점도 없습니다. 문자열 이스케이프의 목적은 변수에 대한 SQL 삽입을 방지하는 것입니다. 일부 경우에는 해당 변수의 값을 조작 할 수 있기 때문입니다 (_GET 또는 _POST 매개 변수에서 오는 경우). 전체 쿼리에서 벗어나면 실제로 주입 가능성이 열립니다. 나는 당신이 mysql_real_escape_string (mysql_escape_string이 제안한 함수의 차이점을주의 깊게 읽는다.)에 대해 조금 더 읽어 보길 권한다. – Luc

-1

. 그것은 우수하고 빠르고 안전합니다.

0

필자는 개인적으로 복잡한 쿼리를 보호하는 것이 PDO, ActiveRecord 등을 사용하는 것보다 훨씬 복잡하고 시간 소모적이라고 생각할 수 있다고 생각합니다. 또한 코드를 데이터베이스와 무관하게 만들 수 있습니다.