현재 위치: > 최신 기사 목록> MySQLI :: STMT_INIT를 사용하여 보안 로그인 검증 메커니즘을 구현하십시오

MySQLI :: STMT_INIT를 사용하여 보안 로그인 검증 메커니즘을 구현하십시오

M66 2025-06-06

PHP 웹 사이트를 개발할 때는 사용자 로그인 기능이 거의 없어야합니다. 그러나 사용자 입력이 실수로 처리되면 SQL 주입 공격에 취약합니다. mysqli :: stmt_initmysqli 확장에 의해 제공되는 방법으로, 전처리 명세서를 사용한 SQL 주입으로 인해 효과적으로 방지 할 수 있습니다. 이 기사는 특정 예제를 사용하여 보안 로그인 인증 메커니즘을 구현하는 방법을 사용하는 방법을 설명합니다.

SQL 주입을 방지하는 이유는 무엇입니까?

SQL 주입은 악성 SQL 문을 입력 필드에 주입하여 원래 쿼리 로직을 가진 공격자가 탬퍼하는 공격 기술입니다. 예를 들어, SQL을 직접 스플릿하는 경우 :

 $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

공격자는 사용자 이름이나 비밀번호로 '또는'1 '='1을 입력 할 수 있으므로 쿼리는 항상 사실이며 인증을 우회합니다.

mysqli :: stmt_init 및 전처리 진술의 역할

mysqli :: stmt_init은 mysqli_stmt 객체를 초기화하는 데 사용됩니다. 전처리 진술을 구현하는 첫 번째 단계입니다. SQL을 사용자 입력과 엄격하게 구별하여 주입 공격을 효과적으로 방지 할 수 있습니다.

샘플 코드 : 보안 로그인 확인

다음은 보안 로그인 양식 확인의 예입니다.

 <?php
// 데이터베이스 연결
$mysqli = new mysqli("localhost", "db_user", "db_password", "my_database");

// 연결을 확인하십시오
if ($mysqli->connect_errno) {
    die("연결이 실패했습니다: " . $mysqli->connect_error);
}

// 사용자 제출 사용자 이름 및 비밀번호
$username = $_POST['username'];
$password = $_POST['password'];

// 전처리 명령문 객체를 초기화하십시오
$stmt = $mysqli->stmt_init();

// 쓰다 SQL 쿼리 문,사용 ? 자리 표시 자
$sql = "SELECT id, password_hash FROM users WHERE username = ?";

// 준비 진술
if ($stmt->prepare($sql)) {
    // 바인딩 매개 변수(s 표현하다 string 유형)
    $stmt->bind_param("s", $username);

    // 실행 진술
    $stmt->execute();

    // 결과를 얻으십시오
    $stmt->bind_result($user_id, $password_hash);

    // 결과가 있는지 확인하십시오
    if ($stmt->fetch()) {
        // 비밀번호를 확인하십시오(데이터베이스가 저장되었다고 가정하십시오 password_hash() 결과)
        if (password_verify($password, $password_hash)) {
            echo "성공적으로 로그인하십시오,사용자를 환영합니다 ID:$user_id";
            // 세션을 설정하거나 점프하십시오,예를 들어:
            // header("Location: https://m66.net/dashboard.php");
        } else {
            echo "오류 비밀번호";
        }
    } else {
        echo "사용자 이름이 존재하지 않습니다";
    }

    // 가까운 진술
    $stmt->close();
} else {
    echo "SQL 진술 준비가 실패했습니다: " . $mysqli->error;
}

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

요약

전처리 명세서와 함께 mysqli :: stmt_init 과 함께 bind_param을 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 전처리 명세서는 특히 데이터베이스 작업이 관련 될 때 사용자 입력을 처리하기 위해 항상 개발에 사용해야합니다. 또한 Password_hash ()Password_Verify () 와 같은 기능을 사용하여 비밀번호 보안을 향상시켜야합니다.

로그인 시스템 또는 사용자 인증 모듈을 구축하는 경우이 메소드를 먼저 사용하여 기존 문자열 스 플라이 싱보다 훨씬 안전합니다.