>  기사  >  백엔드 개발  >  내 로그인 양식이 내 MySQL 데이터베이스에 연결되지 않는 이유는 무엇입니까?

내 로그인 양식이 내 MySQL 데이터베이스에 연결되지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-25 11:13:02736검색

Why is My Login Form Not Connecting to My MySQL Database?

로그인 양식을 MySQL 데이터베이스에 연결할 수 없습니다

이 문의는 MySQL 데이터베이스를 확인하는 사용자 로그인 기능 구현과 관련이 있습니다. 사용자는 데이터베이스에 저장된 자격 증명과 비교하여 유효성을 검사해야 하는 사용자 이름과 비밀번호를 입력할 것으로 예상합니다. 안타깝게도 양식은 오류 없이 제출되지만 원하는 기능은 달성되지 않습니다.

문제 해결

이 문제의 근본 원인은 SQL 주입 공격에 대한 보호가 부족하고 안전하지 않은 데 있습니다. 데이터베이스에 일반 텍스트로 비밀번호를 저장합니다. 이러한 문제를 해결하려면 다음을 수행하는 것이 좋습니다.

  • 준비된 문 사용: 사용자 입력을 매개변수화하여 SQL 주입 공격을 방지합니다. 사용자 입력을 SQL 쿼리에 직접 삽입하는 대신 자리 표시자가 사용되고 매개변수는 이러한 자리 표시자에 바인딩됩니다.
  • 적절한 비밀번호 해싱 구현: 다음과 같은 단방향 해싱 기능을 사용하여 비밀번호를 안전하게 저장합니다. bcrypt 또는 PBKDF2. 이를 통해 데이터 유출 시 승인되지 않은 사용자가 일반 텍스트 비밀번호에 액세스하는 것을 방지할 수 있습니다.

코드 솔루션(준비된 문 및 비밀번호 해싱 사용)

Register.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

if (isset($_POST['register'])) {
    $email = $_POST['email'];
    $password = $_POST['password']; // Cleartext password from user

    // New code for password hashing
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $stmt = $conn->prepare("INSERT INTO user_accounts (email, password) VALUES (?, ?)");
        $stmt->execute([$email, $hashed_password]);
        
        // Redirect to login page
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>

Login.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

if (isset($_POST['login'])) {
    $email = $_POST['email'];
    $password = $_POST['password']; // Cleartext password from user

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Get hashed password from database
        $stmt = $conn->prepare("SELECT password FROM user_accounts WHERE email = ?");
        $stmt->execute([$email]);
        $hashed_db_password = $stmt->fetchColumn();

        if (password_verify($password, $hashed_db_password)) {
            // User authenticated successfully
            $_SESSION['userid'] = true;
            
            // Redirect to safe page
        } else {
            // Authentication failed
        }
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>

이러한 코드 수정을 통해 이제 사용자 로그인은 MySQL 데이터베이스와 안전하게 상호 작용하여 올바르게 작동해야 합니다. SQL 인젝션 공격과 사용자 비밀번호 유출.

위 내용은 내 로그인 양식이 내 MySQL 데이터베이스에 연결되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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