> 데이터 베이스 > MySQL 튜토리얼 > 특정 문자 세트 조건에서 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?

특정 문자 세트 조건에서 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?

Susan Sarandon
풀어 주다: 2025-01-25 21:31:10
원래의
633명이 탐색했습니다.

Can SQL Injection Bypass `mysql_real_escape_string()` Under Specific Character Set Conditions?

특정 상황에서 mysql_real_escape_string()를 우회하는 SQL 인젝션

mysql_real_escape_string()은 일반적으로 SQL 주입 취약점을 제거한다고 여겨지지만 일부 특수한 경우에는 여전히 우회될 수 있습니다.

취약점 분석

특정 시나리오에서 공격자는 데이터베이스 연결의 문자 집합이 ASCII 문자'와 '(예: gbk, sjks)를 모두 지원하도록 선택할 때 발생하는 mysql_real_escape_string()의 결함을 악용할 수 있습니다.

공격자는 잘못된 멀티바이트 문자 시퀀스(예: xbfx27)가 포함된 페이로드를 구성할 수 있으며, mysql_real_escape_string()을 통해 처리하면 이스케이프되지 않은 ' 문자가 생성됩니다. 따라서 쿼리에 삽입하면 SQL 삽입이 발생합니다.

다음 PHP 코드를 고려해보세요.

<code class="language-php">$login = mysql_real_escape_string($_POST['login']);
$password = mysql_real_escape_string($_POST['password']);

$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
로그인 후 복사

공격자가 $_POST['login']의 값을 \xbf\x27 OR 1=1 /*로 설정하면 mysql_real_escape_string()의 보호를 우회하여 테이블의 모든 행을 검색할 수 있습니다.

완화 조치

이 취약점을 완화하려면 다음을 수행하세요.

  • 최신 MySQL 버전으로 업그레이드: 최신 MySQL 버전(예: MySQL 5.1)에는 이 특정 문제에 대한 수정 사항이 포함되어 있습니다.
  • 안전한 문자 세트 사용: ' 및 '를 유효한 문자로 지원하지 않는 문자 세트(예: utf8, latin1)를 사용하세요.
  • PDO에서 에뮬레이트된 준비된 문을 비활성화합니다. PDO::ATTR_EMULATE_PREPARES를 false로 설정하여 실제 준비된 문을 강제로 사용합니다.
  • 문자 집합을 올바르게 설정하세요. mysql_set_charset() 또는 PDO의 DSN 문자 집합 매개 변수를 사용하여 데이터베이스 연결의 문자 집합을 명시적으로 설정하세요.
  • SQL 모드 'NO_BACKSLASH_ESCAPES' 사용(주의해서 사용): 이 SQL 모드는 이스케이프 중에 유효한 문자가 생성되는 것을 방지하여 이 특정 취약점을 완화합니다. 그러나 잠재적인 부작용에 유의하십시오.

위 내용은 특정 문자 세트 조건에서 SQL 주입이 `mysql_real_escape_string()`을 우회할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿