SEブログ

【PHP】パスワードをハッシュで暗号化する

こんにちは!

 

ユーザー登録画面を作って思ったのですが、ユーザー情報を入力して登録した後で、入力したパスワードが DB に保存される時に、そのままの状態で保存されてしまうのはセキュリティー的に考えると非常にリスクが高いかと思います。

 

例えば、データベースに攻撃を受けたときに、登録されているパスワードが全て盗まれた時に、パスワードがそのままですと、ユーザーアカウント名さえ分かれば簡単にログインできてしまいます。

 

ですので、パスワードの暗号化は非常に重要です。

PHP では、関数を使って入力されたパスワードを暗号化する事ができますので、それを使うと良いでしょう。

但し、これはあくまでもデータベースへの攻撃対策の為になります。以下に PHP マニュアルを引用させていただきました。

 

安全なパスワードハッシュ | PHP マニュアル

 

しかし、ここで注意すべき点は、パスワードのハッシュ処理はあくまでもデータベースへの不正アクセスからの保護にすぎず、 アプリケーション自体に不正なコードを注入される攻撃からは守れないということです。

 

 

参考までに、備忘録も兼ねてコードを書いてみました。

 

 

スポンサーリンク

ユーザー登録画面

 

 

<form action="" method="post">
    <label for="username">ユーザー名
        <input type="username" name="username" value="">
    </label>
    <label for="password">パスワード
        <input type="password" name="password" value="">
    </label>
    <input type="submit" value="送信">
</form>

 

 

スポンサーリンク

ユーザー情報の登録処理

 

<?php

    $username = '';
    $password = '';
    $messages = array();
    $err_msgs = array();
        
    // DB接続情報
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWD', 'password');
    define('DB_NAME', 'test');
    define('DSN', 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8');

    // POST処理 
    if ($_SERVER ['REQUEST_METHOD'] === 'POST') {
        if(isset($_POST[$username] === TRUE) {
            $username = $POST[$username];
        }
        if(isset($_POST[$username] === TRUE) {
            $password = $POST[$password];
        }
    }
    // DBに接続し、POST処理でエラーが無ければパスワードをハッシュ化し、クエリを実行します。
    try {
        $pdo = new PDO(DSN, DB_USER, DB_PASSWD);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        if (($_SERVER ['REQUEST_METHOD'] === 'POST') && count($err_msgs) === 0) {

            // ここで、password_hash 関数を使って、$hash 変数に代入してます。
            $hash = password_hash ($password, PASSWORD_DEFAULT);

            $sql = '
            INSERT INTO user_table(
             username,
             password
            VALUES( :username, :password )';
            $stmt = $pdo->prepare($sql);
            $stmt->bindValue(':username',$username,PDO::PARAM_STR);
            $stmt->bindValue(':password',$hash,PDO::PARAM_STR);
            $stmt->execute();
            
            $messages[] = '登録に成功しました。
        } catch(PDOException $e) {

            $err_msgs[] = 'DBに接続できませんでした。' . $e->getMessage();

        }
    }
?>

 

 

いかがでしょうか。最低限、データーベースに入っているパスワードは暗号化する事は必要だと思います。

 

この他にも、ログイン時に入力したパスワードと、一旦データベースにハッシュ化されたパスワードを比較する事もできます。

これは、password_verity という関数でできますので、調べてみると良いでしょう。

 

一応、記事も書いておきました。

【PHP】入力したパスワードとハッシュ化したものを検証する

 

 

では最後までお読みいただきありがとうございました!