ホームページ  >  記事  >  バックエンド開発  >  ログイン フォームが 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。