현재 위치: > 최신 기사 목록> SQL 주입 방지에서 STMT_INIT의 역할과 가치

SQL 주입 방지에서 STMT_INIT의 역할과 가치

M66 2025-06-02

mysqli :: stmt_init는 준비된 문을 초기화하는 데 사용되는 PHP MySQLI 확장 방법의 메소드입니다. 준비된 명령문은 SQL 쿼리를 실행하는 메커니즘으로, SQL 쿼리를 사용자가 입력 한 변수와 분리하여 SQL 주입 공격을 효과적으로 피할 수 있습니다. 이 방법을 통해 개발자는 먼저 빈 명령문 객체를 생성하고 매개 변수를 바인딩하고 후속 작업에서 실행할 수 있습니다.

SQL 주입 공격을 방지하기위한 원칙

SQL 주입 공격의 원리는 공격자가 사용자가 입력 한 필드 (예 : 로그인 양식의 사용자 이름, 암호 등)에 악의적 인 SQL 코드를 주입하고 부적절한 방식으로 SQL 쿼리로 직접 연결한다는 것입니다. 이러한 방식으로 공격자는 원래 SQL 문을 수정하여 악성 작업을 수행 할 수 있습니다. 이를 피하기 위해 MySQLI는 준비된 진술 및 바인딩 매개 변수를 제공합니다.

MySQLI :: STMT_INIT 의 도움으로 개발자는 다음 단계를 통해 SQL 주입을 피할 수 있습니다.

  1. 별도의 쿼리 구조 및 데이터 : mysqli :: stmt_init는 쿼리 구조가 고정되어있는 SQL 쿼리 템플릿을 초기화하는 데 사용되며 실제 입력 데이터는 매개 변수 바인딩을 통해 데이터베이스로 전달됩니다. 이는 사용자가 입력 한 모든 데이터가 SQL 문과 직접 ​​연결되지 않지만 매개 변수로 데이터베이스에 전달됩니다.

  2. 바인딩 매개 변수 : BINT_PARAM 메소드를 통해 개발자는 사용자 입력을 SQL 쿼리의 매개 변수에 바인딩 할 수 있습니다. 이러한 입력 데이터는 SQL 코드로 실행되지 않도록 MySQL 서버에 의해 처리되고 이스케이프됩니다. 예를 들어, 문자열은 자동으로 인용되고 숫자는 적절하게 처리됩니다. 이러한 방식으로 사용자가 악성 SQL 코드를 입력하더라도 쿼리 실행에 영향을 줄 수 없습니다.

  3. 쿼리 실행 : 모든 매개 변수가 바인딩 된 후에 만 ​​쿼리가 실행됩니다. 이러한 방식으로, 사용자가 SQL 주입 코드를 포함하는 문자열을 입력하더라도 전체 쿼리 문을 조작하지 않아 데이터의 보안을 보장합니다.

mysqli :: stmt_init을 통해 쿼리 보안을 향상시키는 방법?

mysqli :: stmt_init 및 preprocessing 문을 사용하면 SQL 주입 공격의 위험을 근본적으로 줄일 수 있습니다. 이를 달성하기위한 단계는 다음과 같습니다.

  1. 초기화 명세서 : mysqli :: stmt_init을 사용하여 빈 전처리 명령문 개체를 만듭니다.

     $conn = new mysqli('localhost', 'username', 'password', 'database');
    $stmt = $conn->stmt_init();
    
  2. SQL 쿼리 준비 : 준비 메소드를 사용하여 준비된 SQL 문 템플릿을 만듭니다. SQL 쿼리의 사용자 입력 부품은 대신 자리 표시기 (예 : ? )를 사용합니다.

     $sql = "SELECT * FROM users WHERE username = ? AND password = ?";
    if ($stmt->prepare($sql)) {
        // 추가 작동
    }
    
  3. 바인딩 매개 변수 : BINT_PARAM 메소드를 사용하여 SQL 쿼리 템플릿의 자리 표시기와 사용자 입력 값을 바인딩합니다. 이 메소드의 두 번째 매개 변수는 S를 나타내는 것과 같은 매개 변수의 유형을 나타냅니다. I는 정수 등을 나타냅니다.

     $stmt->bind_param('ss', $username, $password);
    
  4. 쿼리 실행 : 마지막으로, Execute 메소드를 통해 실행될 매개 변수가있는 SQL 쿼리.

     $stmt->execute();
    

이러한 방식으로 SQL 쿼리의 사용자 입력은 항상 SQL 코드가 아닌 데이터로 취급되므로 SQL 주입 공격을 피합니다.

샘플 코드 : 로그인 확인

다음은 mysqli :: stmt_init을 사용하여 SQL 주입을 방지하는 방법을 보여주는 실용적인 예입니다.

 <?php
$conn = new mysqli('localhost', 'username', 'password', 'database');

// 연결이 성공했는지 확인하십시오
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 사용자 입력을 얻으십시오
$username = $_POST['username'];
$password = $_POST['password'];

// 전처리 진술을 초기화하십시오
$stmt = $conn->stmt_init();

if ($stmt->prepare("SELECT * FROM users WHERE username = ? AND password = ?")) {
    // 바인딩 매개 변수
    $stmt->bind_param('ss', $username, $password);

    // 쿼리를 실행하십시오
    $stmt->execute();

    // 결과를 얻으십시오
    $result = $stmt->get_result();

    if ($result->num_rows > 0) {
        echo "성공적으로 로그인하십시오!";
    } else {
        echo "유효하지 않은 사용자 이름 또는 비밀번호。";
    }

    // 가까운 진술
    $stmt->close();
}

// 연결을 닫으십시오
$conn->close();
?>

이 예에서는 사용자 입력에 악성 코드 (예 : admin 또는 '1'= '1 )가 포함되어 있더라도 입력은 매개 변수로 처리되므로 SQL 쿼리의 구조에 영향을 미치지 않습니다.