回答編集履歴

2

2016/04/07 18:36

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -43,3 +43,93 @@
43
43
 
44
44
 
45
45
  - ユーザ名までハッシュ化してしまうと利便性の面で大きなディスアドバンテージがあるので,パスワードのハッシュ化が強力であればそれだけで十分.
46
+
47
+
48
+
49
+ ----
50
+
51
+
52
+
53
+ 【追記】
54
+
55
+
56
+
57
+ 直すならこんな感じでしょうか. <input /> はHTMLとしては誤っているのでついでに <input> に直しておきます.また後から気づいたんですが,パスワードの方もハッシュ化が無意味になってる気がします. `$admin_password_sha`は最初から直接文字列で定義されているかと思いきや,平文の`$admin_password`から毎回生成されていますよね.**平文でパスワードをスクリプトに書いてはいけません.**それを避けるためにハッシュ関数があるんですから.
58
+
59
+
60
+
61
+ ```HTML
62
+
63
+ <form action="" method="post">
64
+
65
+ <p class="comment">IDとパスワードを入力してください</p>
66
+
67
+ ID<p class="input"><input type="text" name="username"></p>
68
+
69
+ PW<p class="input"><input type="password" name="password"></p>
70
+
71
+ <ul>
72
+
73
+ <li><input type="submit" name="login_button" value="ログイン"></li>
74
+
75
+ </ul>
76
+
77
+ {$login_error_message}
78
+
79
+ </form>
80
+
81
+ ```
82
+
83
+
84
+
85
+ ```PHP
86
+
87
+ global $admin_id; // 平文
88
+
89
+ global $admin_password_hash; // password_hash関数で生成しておいたBlowfishハッシュ
90
+
91
+ global $login_error_message;
92
+
93
+
94
+
95
+ $input_id = (string)filter_input(INPUT_POST, 'username');
96
+
97
+ $input_password= (string)filter_input(INPUT_POST, 'password');
98
+
99
+
100
+
101
+ if ($admin_id === '') {
102
+
103
+ $login_error_message = '<p class="error_message">idが入力されていません</p>';
104
+
105
+ show_login_form();
106
+
107
+ exit;
108
+
109
+ }
110
+
111
+ if ($input_password === '') {
112
+
113
+ $login_error_message = '<p class="error_message">パスワードが入力されていません</p>';
114
+
115
+ show_login_form();
116
+
117
+ exit;
118
+
119
+ }
120
+
121
+ if (($admin_id !== $input_id) | !password_verify($input_password, $admin_password_hash)) {
122
+
123
+ $login_error_message = '<p class="error_message">IDまたはパスワードが違います</p>';
124
+
125
+ show_login_form();
126
+
127
+ exit;
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+ こういうケースではIDもできれば隠蔽したいことでしょう.そのために「IDまたはパスワードが違います」というエラーメッセージでまとめたほうが望ましいです.また,`password_verify`を確実に実行しないと実行時間の差から「最低限IDが間違っている」ということは推測されますので,論理演算子の`||`ではなく短絡評価のないビット演算子の`|`を敢えて使っています.

1

a

2016/04/07 18:36

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -39,3 +39,7 @@
39
39
  - SHA512はハッシュ関数としては十分な強度があるが,ソルト無しで使うとレインボーテーブル攻撃に弱いという欠点があるので,必ずソルトを入れる.更にソルトを毎回ランダムにしてくれる`password_hash`関数やそれに対応した検証関数の`password_verify`を使うのが最もセキュリティが固くなるので,これを使うべき.
40
40
 
41
41
  備考: PHPによる簡単なログイン認証いろいろ
42
+
43
+
44
+
45
+ - ユーザ名までハッシュ化してしまうと利便性の面で大きなディスアドバンテージがあるので,パスワードのハッシュ化が強力であればそれだけで十分.