질문:
제공된 PHP에서 코드에서는 mysqli_real_escape_string을 사용하는 것으로 충분합니다. SQL 주입 공격을 방지하시겠습니까?
$email= mysqli_real_escape_string($db_con,$_POST['email']); $psw= mysqli_real_escape_string($db_con,$_POST['psw']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES ('".$email."','".$psw."')";
답변:
아니요, mysqli_real_escape_string에만 의존하는 것만으로는 SQL 주입 및 기타 SQL 공격을 방지할 수 없습니다.
준비된 명령문은 SQL 주입을 방지하기 위한 보다 강력한 솔루션을 제공합니다. 데이터와 지침을 분리하여 사용자가 제공한 입력이 쿼리 구조를 방해하지 않도록 합니다.
준비된 문을 사용할 수 없는 상황의 경우 특정 목적에 대해 엄격한 화이트리스트를 구현하면 어느 정도 보호할 수 있습니다. 여기에는 악의적인 입력을 방지하기 위해 각 매개변수에 허용되는 값의 사전 결정된 목록을 정의하는 작업이 포함됩니다.
화이트리스트 및 유형 캐스팅을 사용하는 예:
switch ($sortby) { case 'column_b': case 'col_c': // Safe to use break; default: $sortby = 'rowid'; } $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // Execute the query using prepared statements $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
다음과 함께 준비된 명령문을 사용하는 것이 중요합니다. 특히 MySQL을 사용하는 경우에는 에뮬레이트된 준비가 꺼집니다.
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
위 내용은 `mysqli_real_escape_string`은 SQL 주입을 방지하기에 충분합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!