현재 위치: > 최신 기사 목록> stmt_init을 사용한 후 repay ()에게 전화하는 것을 잊어 버리면 어떻게됩니까?

stmt_init을 사용한 후 repay ()에게 전화하는 것을 잊어 버리면 어떻게됩니까?

M66 2025-05-29

전처리 명세서는 데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 일반적이고 안전한 관행입니다. 개발자는 일반적으로 mysqli :: stmt_init ()를 사용하여 명령문 객체를 초기화 한 다음 ready () 메소드를 통해 SQL 문을 준비합니다. 그러나 stmt_init ()를 호출 한 후 read ()을 실행하는 것을 잊어 버리면 몇 가지 암시적인 문제가 발생합니다. 이 기사는 분석하고 예를 제시합니다.

1. stmt_init () 의 기본 사용 및 repay ()

일반적으로 우리의 코드 구조는 다음과 같습니다.

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT * FROM users WHERE id = ?");

안에:

  • stmt_init ()는 mysqli_stmt 객체를 초기화합니다.

  • 준비 () SQL 문을 준비하고 객체에 바인딩합니다.

2. repay ()에게 전화하는 것을 잊어 버리면 어떻게됩니까?

stmt_init () 만 호출하고 repay () 만 호출하는 경우, 다음 유형의 문제는 다음 유형의 문제가 다음과 같은 문의 사용에서 명령문 객체를 사용하면 발생합니다.

1. 메소드 호출 오류

Bind_param () , execute () 와 같은 호출 메소드는 repir ()을 호출하지 않고 직접 경고를 받거나 치명적인 오류를 유발합니다.

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
// 전화하는 것을 잊었습니다 prepare()

$stmt->bind_param("i", $userId); // 오류가 여기에보고됩니다
$stmt->execute();                // 여기에서도 실패 할 것입니다

오류 메시지는 다음과 같습니다.

 Fatal error: Uncaught Error: Call to a member function bind_param() on bool

또는:

 Warning: mysqli_stmt::bind_param(): invalid object or not initialized

2. 구문 오류를 찾을 수 없습니다

명령문 객체를 초기화하지만 repary ()가 없는 경우 repary () 단계에서 찾을 수있는 SQL 오류는 숨겨져 실행 될 때까지 불분명 한 오류로 이어질 수 있습니다. 이로 인해 디버깅 비용이 증가합니다.

3. 보안 위험

사용을 잊어 버린 () 는 SQL 문을 직접 스플릿 할 수 있음을 의미하며, 이는 파라미터 바인딩 메커니즘을 우회하여 SQL 주입의 위험이 증가합니다. 예를 들어:

 // 오류 예제(아니요 prepare)
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $userId";
$result = $mysqli->query($query);

Prepary () 및 매개 변수 바인딩을 사용할 수없는 경우 사용자 입력은 SQL에 직접 내장되어 있으며 공격자는 다음 URL을 구성 할 수 있습니다.

 https://m66.net/get_user.php?id=1 OR 1=1

데이터 유출을 유발합니다.

3. 그것을하는 올바른 방법

항상 stmt_init ()를 사용하여 쌍을 이루고 다음과 같이 repay () .

 $mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM users WHERE id = ?")) {
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        echo $row['username'] . "<br>";
    }
    $stmt->close();
} else {
    echo "SQL prepare 실수: " . $mysqli->error;
}

4. 요약

전화를 잊어 버렸습니다 ()은 다음과 같은 문제를 일으킬 것입니다.

  • 다른 명령문 방법을 호출하는 동안 오류가 발생했습니다.

  • SQL 오류는 미리 잡을 수 없습니다.

  • SQL 주입과 같은 보안 위험을 증가시킵니다.

STMT_INIT ()를 사용한 직후에 repay ()를 호출하고 리턴 값을 판단하여 프로그램의 안정성과 보안을 보장하는 것이 좋습니다.