mysql_real_escape_string () 함수는 SQL 주입을 방지하지만 특정 경우에 우회 될 수 있습니다.
다음 php 코드를 고려하십시오 :
$ login = mysql_real_escape_string (getfrompost ( 'login'));
$ password = mysql_real_escape_string (getfrompost ( 'password'));
$ sql = "login = '$ login'및 password = '$ password'";
이 코드는 안전 해 보이지만 문자 세트 인코딩의 가장자리 케이스로 인해 악용 될 수 있습니다.
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
공격은 다음 단계에 따라 다릅니다.
문자 세트 세트 :
동일한 바이트 시퀀스가 비 ASCII 문자와 ASCII 백 슬래시 ( '\')를 나타내는 인코딩 (예 : GBK)을 선택합니다.
작업 원리 :
대신 mysql_set_charset () case.
의 결과로 :
이 공격은 시뮬레이션 된 전처리 명령문이 비활성화 된 경우에도 PDO의 시뮬레이션 전처리 명세서를 우회 할 수 있습니다.
UTF8MB4 또는 UTF8과 같은 비 유명한 문자 세트를 사용 하여이 문제를 완화합니다. no_backslash_escapes sql 모드를 활성화합니다.
안전 예 :
항상
mysql_set_charset ()또는 pdo의 dsn 문자 세트 매개 변수를 사용하여 문자 세트를 올바르게 설정합니다. MySQLI의 실제 전처리 진술 도이 공격에 면역이됩니다.
결론에서 :
mysql_real_escape_string ()
는 일반적으로 강력한 보호 기능을 제공하지만 SQL 주입에 대한 완전한 방어를 보장하기 위해 이러한 잠재적 에지 사례를 인식하는 것이 중요합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3