mysql_real_escape_string() 및 mysql_escape_string()이 앱 보안에 충분합니까?
이러한 함수는 SQL 삽입 및 기타 공격에 대해 어느 정도 보호를 제공할 수 있습니다. , 특정 취약점을 해결하지 못합니다.
SQL 주입
Mysql_real_escape_string()은 쿼리 내에서 PHP 변수를 부적절하게 처리하는 경우 여전히 응용 프로그램을 SQL 주입에 노출시킬 수 있습니다. 다음 예를 고려하십시오.
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
mysql_real_escape_string()은 테이블 이름, 열 이름 또는 LIMIT 필드를 보호하도록 설계되지 않았기 때문에 공격자가 이 쿼리를 조작하여 승인되지 않은 SQL 문을 실행할 수 있습니다.
Like 공격
Mysql_real_escape_string()은 LIKE 공격을 방지하기에는 충분하지 않습니다. 공격자는 "%%"와 같은 악성 값을 입력하여 모든 레코드를 반환할 수 있으며 잠재적으로 민감한 정보를 손상시킬 수 있습니다.
Charset Exploits
특정 브라우저는 charset에 취약할 수 있습니다. 익스플로잇을 통해 공격자는 이스케이프 메커니즘을 우회하고 임의의 SQL 명령을 실행하는 악성 문자를 주입할 수 있습니다.
준비된 명령문: 종합 솔루션
애플리케이션을 효과적으로 보호하려면 mysql_real_escape_string() 대신 준비된 명령문을 사용하는 것이 좋습니다. 준비된 문은 사용자가 제공한 값을 매개변수로 바인딩하여 SQL 쿼리를 실행합니다. 이렇게 하면 수동 이스케이프가 필요 없으며 승인된 SQL만 실행됩니다.
다음은 PHP에서 준비된 문을 사용하는 예입니다.
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
준비된 문은 다음을 통해 사전 방어 메커니즘을 제공합니다. 기본 데이터베이스 서버의 보안 기능을 활용합니다. 알려진 공격과 알려지지 않은 공격 모두에 대해 본질적으로 저항력이 있어 데이터 무결성을 보장합니다.
위 내용은 `mysql_real_escape_string()` 및 `mysql_escape_string()`을 사용하면 애플리케이션을 보호하기에 충분합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!