문제

http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this , 특정 아시아 문자 인코딩으로 mysql_real_escape_string을 우회 할 수 있다고 주장하는 섹션이 있습니다.

big5 또는 gbk로 mysql_real_escape_string ()를 우회합니다

"주입 문자열"
に に に 追加 関する :

위의 숯은 중국의 big5입니다

이것이 정말로 사실입니까? 그렇다면 준비된 진술에 액세스 할 수 없다면 웹 사이트를 어떻게 보호 하시겠습니까?

도움이 되었습니까?

해결책

Stefan Esser에 따르면 "mysql_real_escape_string() 언제] 안전하지 않습니다 SET NAMES 사용."

그의 설명, 그의 블로그에서:

세트 이름은 일반적으로 인코딩을 기본값에서 응용 프로그램에 필요한 것으로 전환하는 데 사용됩니다. 이것은 그런 식으로 이루어집니다 mysql_real_escape_string 이것에 대해 모릅니다. 이것은 당신이 몇 가지 멀티 바이트 인코딩으로 전환하는 경우, 두 번째 3 번째 4 번째로 백 슬래시를 허용하는 것입니다. mysql_real_escape_string 올바르게 탈출하지 않습니다. UTF-8은 안전합니다…

인코딩을 변경하는 안전한 방법은입니다 mysql_set_charset, 그러나 그것은 새로운 PHP 버전으로만 사용할 수 있습니다.

그는 UTF-8이 안전하다고 언급합니다.

다른 팁

이것은 2006 년 5 월에 수정 된 것으로 알려진 MySQL 서버 버그입니다.

보다:

버그는 MySQL 4.1.20, 5.0.22, 5.1.11에 고정 된 것으로보고되었습니다.

4.1.x, 5.0.x 또는 5.1.x를 사용하는 경우 적어도 작은 개정 번호로 업그레이드했는지 확인하십시오.

해결 방법으로 SQL 모드를 활성화 할 수도 있습니다. NO_BACKSLASH_ESCAPES Backslash를 견적 에스케이프 캐릭터로 비활성화합니다.

SQL을 사용하여 숯 인코딩을 변경하는 경우에만 작동하지 않습니다.

다른 사람들이 보여준 것처럼 mysql_real_escape_string() 모호한 가장자리 케이스에서 우회 할 수 있습니다. 그것은 탈출 논리를 우회하는 것으로 알려진 전략 중 하나이지만 아직 발견되지 않은 다른 알려지지 않은 취약점이있을 수 있습니다.

간단하고 효과적인 방법 PHP에서 SQL 주입 방지 사용하는 것입니다 준비된 진술 당신이 할 수있는 곳, 그리고 매우 엄격한 당신이 할 수없는 곳에서 화이트리스트.

PDO 드라이버가 실제로 사용하고 모방하지 않은 경우 준비된 진술은 응용 프로그램 보안의 근본적인 문제를 해결하므로 (SQL 주입과 관련하여) 안전 할 수 있습니다. 데이터 ~로부터 지침 데이터에서 작동합니다. 그들은 별도의 패킷으로 전송됩니다. 매개 변수화 된 값은 쿼리 문자열을 오염시킬 기회가 없습니다.

2015 년입니다. 더 이상 탈출하고 연결하지 마십시오. 응용 프로그램 (및 비즈니스) 논리에 따라 입력을 여전히 검증해야하지만 준비된 진술 만 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top