> 데이터 베이스 > MySQL 튜토리얼 > 준비된 명령문과 매개 변수화 된 쿼리는 PHP에서 SQL 주입을 어떻게 막을 수 있습니까?

준비된 명령문과 매개 변수화 된 쿼리는 PHP에서 SQL 주입을 어떻게 막을 수 있습니까?

Patricia Arquette
풀어 주다: 2025-01-25 22:07:12
원래의
158명이 탐색했습니다.

How Can Prepared Statements and Parameterized Queries Prevent SQL Injection in PHP?

PHP에서 SQL 주입 방지

SQL 주입 취약점은 사용자 입력이 제대로 처리되지 않고 SQL 쿼리에 삽입되는 경우 발생합니다. 이 위험을 이해하려면 다음 예를 고려하십시오.

<code class="language-php">$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");</code>
로그인 후 복사

이 시나리오에서 사용자가 value'); DROP TABLE table;--과 같은 값을 악의적으로 입력하면 쿼리는 다음과 같습니다.

<code class="language-sql">INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')</code>
로그인 후 복사

이렇게 하면 데이터베이스에 대한 악의적인 공격의 문이 열립니다.

완화 기술:

어떤 데이터베이스를 사용하든 관계없이 SQL 삽입을 방지하기 위해 권장되는 보안 방법은 SQL에서 데이터를 분리하는 것입니다. 이는 데이터가 데이터로 처리되고 SQL 파서에 의해 명령으로 해석되지 않도록 보장하는 것을 의미합니다. 이 목표를 달성하는 가장 효율적인 방법은 준비된 문과 매개 변수화된 쿼리를 사용하는 것입니다.

준비된 문 및 매개변수화된 쿼리:

준비된 명령문에는 SQL 쿼리와 매개변수를 별도로 데이터베이스 서버에 전송하여 데이터베이스가 이들 조합을 처리할 수 있도록 하는 작업이 포함됩니다. 이는 전송 전에 데이터가 PHP에 의해 구문 분석되지 않도록 하여 악의적인 SQL 주입 시도를 방지합니다.

구현 옵션:

Prepared 문을 구현하는 두 가지 주요 방법은 다음과 같습니다.

  1. PDO(PHP 데이터 개체):

    이것은 지원되는 모든 데이터베이스 드라이버에서 작동하는 일반적인 방법입니다. 사용 예는 다음과 같습니다.

    <code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    $stmt->execute([ 'name' => $name ]);
    
    foreach ($stmt as $row) {
        // 处理行
    }</code>
    로그인 후 복사
  2. MySQLi(MySQL 개선 확장):

    MySQL 데이터베이스의 경우 MySQLi를 사용할 수 있습니다. PHP 8.2부터 execute_query() 메서드를 사용하여 단일 단계로 매개변수를 준비하고, 매개변수를 바인딩하고, SQL 문을 실행할 수 있습니다.

    <code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
    while ($row = $result->fetch_assoc()) {
        // 处理行
    }</code>
    로그인 후 복사

    PHP 8.1 이하:

    <code class="language-php">$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
    $stmt->bind_param('s', $name); // 's' 表示'字符串'变量类型
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // 处理行
    }</code>
    로그인 후 복사

MySQL 이외의 데이터베이스를 사용하는 경우 PostgreSQL의 pg_prepare()pg_execute()과 같은 드라이버별 대안이 있습니다.

올바른 연결 설정:

연결을 설정할 때 성능과 보안을 향상하려면 준비된 명령문의 에뮬레이션을 비활성화하는 것이 중요합니다.

PDO 연결:

<code class="language-php">$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</code>
로그인 후 복사

MySQLi 연결:

<code class="language-php">mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 错误报告
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // 字符集</code>
로그인 후 복사

결론:

준비된 명령문을 구현하고 연결을 올바르게 설정하면 SQL 주입 공격을 효과적으로 방지하고 데이터베이스 애플리케이션의 보안과 무결성을 보장할 수 있습니다.

위 내용은 준비된 명령문과 매개 변수화 된 쿼리는 PHP에서 SQL 주입을 어떻게 막을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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