> 백엔드 개발 > PHP 튜토리얼 > mysql_real_escape_string() 대 addlashes(): 어떤 이스케이프 함수가 더 나은 SQL 주입 보호를 제공합니까?

mysql_real_escape_string() 대 addlashes(): 어떤 이스케이프 함수가 더 나은 SQL 주입 보호를 제공합니까?

Susan Sarandon
풀어 주다: 2024-10-21 13:02:02
원래의
849명이 탐색했습니다.

mysql_real_escape_string() vs. addslashes(): Which Escaping Function Provides Better SQL Injection Protection?

SQL 주입 보호를 위한 mysql_real_escape_string()과 addlashes()의 차이점 이해

웹 애플리케이션 개발에서는 SQL 주입 공격을 방지하는 것이 중요합니다. addlashes()는 문자를 이스케이프하는 데 일반적으로 사용되는 함수이지만 특정 시나리오에서는 부족합니다. mysql_real_escape_string() 함수는 이러한 제한 사항을 구체적으로 해결하여 SQL 주입 방지를 강화합니다.

문자 이스케이프 차이

mysql_real_escape_string()은 더 넓은 범위의 문자(x00, n, r, , ', ")를 이스케이프합니다. 및 x1a)은 세 문자(' 및 NUL)만 이스케이프하는 addlashes()와 비교됩니다. 이 포괄적인 적용 범위는 잠재적으로 SQL 주입에 악용될 수 있는 문자를 적절하게 이스케이프하여 취약점을 최소화합니다.

SQL 주입 addlashes()의 취약성

addlashes()를 사용함에도 불구하고 웹앱이 문자 이스케이프를 위해 이 함수에만 의존하는 경우 웹앱은 여전히 ​​SQL 주입에 취약합니다. addlashes()가 실패하는 한 가지 시나리오는 악의적인 입력에 큰따옴표가 포함된 경우입니다. ("). 이러한 따옴표는 이미 인용된 문자열을 종료하여 공격자가 임의의 SQL 문을 삽입할 수 있게 합니다.

예:

<code class="php">$username = addslashes($_POST['username']);
$sql = "SELECT * FROM users WHERE username='$username'";</code>
로그인 후 복사

사용자 입력이 "John' OR 1='1"인 경우 , addlashes()는 작은따옴표(')만 이스케이프하므로 다음 SQL 문이 생성됩니다.

<code class="sql">SELECT * FROM users WHERE username='John\' OR 1=\'1\'</code>
로그인 후 복사

큰따옴표(")는 이스케이프되지 않으므로 공격자가 인용된 문자열을 종료하고 추가할 수 있습니다. 결과적으로 쿼리는 John 대신 모든 사용자를 반환하므로 민감한 정보가 손상될 가능성이 있습니다.

결론

addlashes()는 SQL 주입 보호를 위한 기본 문자 이스케이프 기능을 제공합니다. 취약점을 완전히 제거하는 것만으로는 충분하지 않습니다. mysql_real_escape_string()은 더 넓은 범위의 문자를 이스케이프하여 이러한 제한을 극복하고, addlashes()가 실패하는 시나리오를 해결함으로써 mysql_real_escape_string()을 사용하거나 매개변수화된 쿼리를 우수한 대안으로 채택함으로써 웹 개발자는 SQL 주입 공격으로부터 애플리케이션을 보호합니다.

위 내용은 mysql_real_escape_string() 대 addlashes(): 어떤 이스케이프 함수가 더 나은 SQL 주입 보호를 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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