mysql_real_escape_string()은 완벽합니까?
SQL 주입 공격으로부터 보호하기 위해 일반적으로 사용되지만 mysql_real_escape_string()은 드물고 복잡한 경우에도 우회할 수 있습니다.
기발한 공격
매우 구체적인 문자 집합으로 세심하게 제작된 페이로드를 사용하면 mysql_real_escape_string()을 악용할 수 있습니다. 분석 내용은 다음과 같습니다.
-
문자 집합 선택: 서버의 연결 문자 집합은 ASCII 백슬래시('')와 최종 바이트가 ASCII '인 문자를 모두 지원하는 문자 집합으로 설정되어야 합니다. 예를 들어 'gbk'가 이 기준을 충족합니다.
-
Payload: 바이트 시퀀스 '0xbf27'로 구성된 Apayload가 선택됩니다. 'gbk'에서는 잘못된 문자이지만 'latin1'에서는 '¿''를 나타냅니다.
-
mysql_real_escape_string(): MySQL의 이 함수 구현은 연결 문자 집합( 이 경우 'gbk') 해당 규칙에 따라 이스케이프를 적용합니다. 그러나 클라이언트는 여전히 연결이 'latin1'을 사용하고 있다고 믿습니다. 따라서 'mysql_real_escape_string()'을 사용하여 바이트 시퀀스를 이스케이프하면 백슬래시를 삽입합니다.
-
쿼리: 결과 문자열에 자유 행 ' 문자가 포함됩니다: '縗' 또는 'gbk'의 1=1 /*'입니다. 이것이 공격에 필요한 악성 페이로드입니다.
눈부신 취약점
-
PDO 에뮬레이트된 명령문:PDO는 기본적으로 다음을 사용하여 준비된 명령문을 에뮬레이트합니다. mysql_real_escape_string()을 사용하면 이에 취약해집니다. 공격.
-
mysql_real_escape_string() 버그: MySQL 4.1.20 및 5.0.22 이전에는 mysql_real_escape_string()에 잘못된 멀티바이트 문자를 단일 바이트로 처리하는 버그가 있었습니다. 올바른 연결 인코딩에 대한 정보를 제공하여 이 공격을 허용합니다. 성공합니다.
-
PDO의 제한된 보호 조치: PHP ≥ 5.3.6에 도입된 PDO의 DSN 문자 집합 매개변수는 모든 명령에 대해 일관되게 지원되지 않습니다. 이는 악용 가능성의 여지를 남깁니다.
그림자 제거
-
안전한 문자 세트: 'utf8' 또는 'utf8mb4'와 같은 취약한 문자 세트를 활용하면 이것 공격.
-
NO_BACKSLASH_ESCAPES SQL 모드: 이 모드를 활성화하면 mysql_real_escape_string()의 작동 방식이 변경되어 취약한 인코딩에서 유효한 문자 생성이 방지됩니다.
-
최신 MySQL 버전 및 준비된 명령문: MySQL 버전 5.1(후기), 5.5 이상은 실제 준비된 명령문(예: MySQLi)과 함께 이 악용에 면역입니다.
결론적으로 mysql_real_escape_string()은 일반적으로 효과적이지만 특정 시나리오에서는 우회될 수 있습니다. . 최신 버전의 MySQL, 적절한 문자 집합 선택, 준비된 명령문은 이 복잡한 공격으로부터 완벽한 보호를 보장합니다.
위 내용은 `mysql_real_escape_string()`은 SQL 주입에 대해 정말로 안전합니까, 아니면 미묘한 취약점이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!