ログイン画面のセキュリティを考える(CakePHP修行 #020)
- July 3rd, 2007
- Posted in CakePHP関連
- Write comment
さてさてログインフォームの改善を続けます。
次はセキュリティ関連。気になる点は以下の二つ。
- ログイン画面ってわけではないですが、パスワードを平文で保存しているのが不安。ハッシュ化したいところ。
- 不正な入力値がないようになにか対策をすべきかどうか?するならどうする?
■ パスワードのハッシュ化
まずDBにパスワードをそのまま突っ込んでいるのが不安です。これはハッシュ化すべきでしょう。そこでDBのpwdフィールドには「任意のキーワード+パスワード」をsha1でハッシュ化したものを突っ込むことにします。任意のキーワードを足すのはセキュリティを高めるためです。
ちなみに今までmd5を使っていたのですが、青い人によると「選べるならsha1の方が良い。md5はぜい弱性が発見されたから」とのことでした。
まずは任意のキーワードを設定します。こういう共通定数っぽいものは/app/config/app.phpに記述してAppControllerで読み込んじゃうのがよさそう。
参考にしたのはこちら(← これも青い人に教えてもらった)。
» CakePHP アプリケーションの設定情報をまとめる | Shin x blog
そのとおりにやってみます。
/app/config/app.phpは以下のとおり。
<?php
define('PWD_KEY', 'abcde');
次に /app/app_controller.php に次の一行を追加。
config ('app');
これでPWD_KEYへアクセスできるはずです。
そしてログインの認証処理を変更します。ちなみに変更前はこんな感じ。
if(!empty($someone['User']['pwd']) && $someone['User']['pwd'] == $this->data['User']['pwd'])
これを以下のように変更。
if(!empty($someone['User']['pwd']) && $someone['User']['pwd'] == sha1(PWD_KEY.$this->data['User']['pwd']))
なお、データベースに突っ込んだデータは平文だったので、別途sha1でPWD_KEYとパスワードを連結したものをDBにいれておきます。
それでもってテスト・・・うまくいきました!これで一安心ですね。ちなみに現在のDBのpwdフィールドはこんな感じ。
mysql> select id,pwd from users; +----+------------------------------------------+ | id | pwd | +----+------------------------------------------+ | 1 | e1ad1bc1b9e6cf491a54db3b2291bb85a811012d | | 2 | 9652fda44b24564558bef08a873c2d4f922fe168 | +----+------------------------------------------+ 2 rows in set (0.01 sec)
これなら万が一DBを覗かれても安心ですね(100%じゃないけど)。
■ 不正な入力値を防ぐ
いわゆるインジェクション系の穴を防ぐために何ができるかですが・・・考えに考え抜いて・・・・青い人にチャットで聞くことにしました(← そろそろうざがられているのではないかと心配です)。
そうしたら以下のサイトを教えてくれました。
» CakePHP 比較演算子インジェクションに注意 | Shin x blog
つまるところ、現在のログイン処理ではfindByEmailが使われているからOKっぽいということでした。というわけでこれについては今のところ大丈夫、と。
さてさて、セキュリティチェックも終わったし、次はいよいよちょっと複雑なロジック(でもないか)を書いていきます。
※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。


DB内のキーのハッシュ化ということですが、「もしDB内の値が見られても安全にする」ということなら、MD5は論外の事、SHA-1もわりとヤバげなので、できればSHA-512を使った方が確実かと。
WikipediaのMD5の項目からの引用ですが、「MD5のハッシュ値については、パソコンレベルで、数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている。すなわち、強衝突耐性は容易に突破されうる状態にある(SHA-0/SHA-1アルゴリズムについても、MD5ほど容易ではないが突破される脆弱性が発見されている)。」(http://ja.wikipedia.org/wiki/MD5#.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E3.81.AE.E8.A1.9D.E7.AA.81.E8.80.90.E6.80.A7.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6)とされているように、SHA-1(160bit)もハッシュ値の強衝突耐性が突破されています。
くわしくはhttp://ja.wikipedia.org/wiki/SHAで。
設定は、app/config/bootstrap.phpに記述するほうがCakePHPの意図にあってると思います。