sql >> データベース >  >> RDS >> Mysql

データベースと認証ユーザーからソルトされたパスワードを撤回する方法は?

    多くの場合、開発者は、保存されているパスワードハッシュの処理方法がわからないため、ログインパスワードの検証に苦労します。彼らは、パスワードを password_hash( ) 、およびそれらをvarchar(255)に保存します フィールド:

    // Hash a new password for storing in the database.
    // The function automatically generates a cryptographically safe salt.
    $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
    

    ログインフォームでは、保存されているハッシュがソルトされているため、SQLで直接パスワードを確認したり、パスワードを検索したりすることはできません。代わりに...

    1. ユーザーIDで検索して、データベースからパスワードハッシュを読み取る必要があります
    2. その後、 password_verify() 機能。

    以下に、 mysqliを使用してパスワード検証を行う方法を示すサンプルコードをいくつか示します。 繋がり。コードを読みやすくするためのエラーチェックはありません:

    /**
     * mysqli example for a login with a stored password-hash
     */
    $mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
    $mysqli->set_charset('utf8');
    
    // Find the stored password hash in the db, searching by username
    $sql = 'SELECT password FROM users WHERE username = ?';
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('s', $_POST['username']); // it is safe to pass the user input unescaped
    $stmt->execute();
    
    // If this user exists, fetch the password-hash and check it
    $isPasswordCorrect = false;
    $stmt->bind_result($hashFromDb);
    if ($stmt->fetch() === true)
    {
      // Check whether the entered password matches the stored hash.
      // The salt and the cost factor will be extracted from $hashFromDb.
      $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
    }
    

    この例では、SQLインジェクションを回避するためにプリペアドステートメントを使用していることに注意してください。エスケープは必要ありません この場合。 pdoから読み取る同等の例 接続は次のようになります:

    /**
     * pdo example for a login with a stored password-hash
     */
    $dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
    $pdo = new PDO($dsn, $dbUser, $dbPassword);
    
    // Find the stored password hash in the db, searching by username
    $sql = 'SELECT password FROM users WHERE username = ?';
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(1, $_POST['username'], PDO::PARAM_STR); // it is safe to pass the user input unescaped
    $stmt->execute();
    
    // If this user exists, fetch the password hash and check it
    $isPasswordCorrect = false;
    if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false)
    {
      $hashFromDb = $row['password'];
    
      // Check whether the entered password matches the stored hash.
      // The salt and the cost factor will be extracted from $hashFromDb.
      $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
    }
    



    1. MySQLWorkbenchを使用して新しいデータベース図を作成する方法

    2. データベースからcsvファイルにテーブルをエクスポートします

    3. XEvent Profilerを使用して、SQLServerでクエリをキャプチャします

    4. PL / SQLブロックからSELECT文を出力することはできますか?