Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
こんにちは!
ユーザー登録画面を作って思ったのですが、ユーザー情報を入力して登録した後で、入力したパスワードが DB に保存される時に、そのままの状態で保存されてしまうのはセキュリティー的に考えると非常にリスクが高いかと思います。
例えば、データベースに攻撃を受けたときに、登録されているパスワードが全て盗まれた時に、パスワードがそのままですと、ユーザーアカウント名さえ分かれば簡単にログインできてしまいます。
ですので、パスワードの暗号化は非常に重要です。
PHP では、関数を使って入力されたパスワードを暗号化する事ができますので、それを使うと良いでしょう。
但し、これはあくまでもデータベースへの攻撃対策の為になります。以下に PHP マニュアルを引用させていただきました。
しかし、ここで注意すべき点は、パスワードのハッシュ処理はあくまでもデータベースへの不正アクセスからの保護にすぎず、 アプリケーション自体に不正なコードを注入される攻撃からは守れないということです。
参考までに、備忘録も兼ねてコードを書いてみました。
ユーザー登録画面
1 2 3 4 5 6 7 8 9 |
<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> |
ユーザー情報の登録処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?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 という関数でできますので、調べてみると良いでしょう。
一応、記事も書いておきました。
では最後までお読みいただきありがとうございました!