「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP で会員専用ページのログイン システムを安全に実装するにはどうすればよいですか?

PHP で会員専用ページのログイン システムを安全に実装するにはどうすればよいですか?

2024 年 11 月 17 日に公開
ブラウズ:507

How to Securely Implement a Member-Only Page Login System in PHP?

PHP: ログイン システムを使用した安全なメンバー専用ページ

提供されたコードの課題

提供された PHP コードで、その動作を妨げるいくつかの問題が発生しました。機能:

  1. クエリ結果の取得: $data1 = $conn->query($sql1); を使用する代わりに、正しいアプローチは $data = mysqli_fetch_array( $conn->クエリ($sql1));または $data = $conn->query($sql1)->fetch_array();
  2. データベース接続と実行: データベースへの接続は、$total = $data = 0; を使用して確立する必要があります。
  3. MySQLi 構文: トークンを挿入するクエリでは、テーブル名と列名をバックティック () で囲む必要があります (INSERT INTO トークン (tk, gauth) VALUES (?,?)
  4. ユーザー認証: 認証ロジックは、ブール値に依存するのではなく、クエリの結果を返す必要があります ($result = $conn->query($) sql3)->fetch_array();).
  5. トークン生成: 既存のトークン生成メソッドは openssl_random_pseudo_bytes() を使用するため安全ではありません。代わりに、コードでは、random_bytes().

提案されたソリューション

  1. データベース操作の簡素化のような、暗号的に安全な乱数生成器 (CSPRNG) を使用する必要があります。単一のクエリを使用してユーザー情報を取得し、認証情報を確認します。
  2. プリペアド ステートメントを使用する: SQL インジェクションの脆弱性を防ぐためにパラメーターをバインドします。
  3. トークンを安全に生成します ]: 安全なトークンを生成するには、random_bytes() または同様の関数を使用します。
  4. 認証データをセッションに保存します: 認証トークンを Cookie の代わりにセッション変数に保存します。
  5. トークンの検証: トークン テーブルに対してデータベース クエリを実行して、提供されたトークンを検証します。

改善されたコード

次の改訂されたコードは、特定された問題に対処します。より安全なメンバー専用ページのログイン システムを提供します:

connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // Prepare statement for user authentication
    $sql_auth = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    $sql_auth->bind_param("ss", $_POST['uname'], $_POST['pss']);
    $sql_auth->execute();
    $result_auth = $sql_auth->get_result();

    // Authenticate user
    if ($result_auth->num_rows > 0) {
        $user = $result_auth->fetch_assoc();
        $correct = TRUE;
    } else {
        $correct = FALSE;
    }

    // Generate token
    if ($correct === TRUE) {
        $hex = bin2hex(random_bytes(3));
        $_SESSION['auth'] = $hex;
        $_SESSION['logstat'] = TRUE;
    }

    // Close connection
    $conn->close();
?>
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3