>데이터 베이스 >MySQL 튜토리얼 >`mysqli_real_escape_string`은 SQL 주입을 방지하기에 충분합니까?

`mysqli_real_escape_string`은 SQL 주입을 방지하기에 충분합니까?

DDD
DDD원래의
2024-12-17 20:30:19226검색

Is `mysqli_real_escape_string` Sufficient to Prevent SQL Injection?

mysqli_real_escape_string이 SQL 주입을 방지하기에 충분합니까?

질문:

제공된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.