エンジニア引き止めセミナー資料
エンジニア引き止めセミナー資料

データ送信時のパスワードのハッシュ化

まっちー

CakePHPで会員登録画面を作っていたときのことなのだけど、パスワードを入力する項目と、確認用にもう一度パスワードを入力する項目を、フォームヘルパーのパスワードメソッドを使って作っていたわけです。

echo $form->password('password');

echo $form->password('password_confirm');

で、最初は何の問題もなく動作していたんですが、いろいろと他の部分も作成してサーバーにファイルをアップしているうちに、この部分が正常に動かなくなった。具体的に言うと、確認用じゃない方のパスワードの値だけ自動的にハッシュ化されてしまい、パスワードと確認用のパスワードが一致せずにエラーになってしまうという、そんな状態に陥りました。

で、調べてみたのですが、こちらさんのページの中に、こんなことが書いてあった。

コントローラのアクションで$this->dataを利用する時やモデルでデータを検証しようとする時にはすでにハッシュ化されたパスワードになっています。したがって単純に’password’と’password_confirm’の入力の同一性を確認したり、’password’フィールドに検証ルールを設定して文字数チェックを行うなどの検証ができません。これはAuthComponentがアクションを実行する前にフォームから送られたデータにユーザー名とパスワードに相当するフィールド($fieldsプロパティで設定可能)が揃っているとパスワードをハッシュ化するようになっているからです。

おおう、なるほど。だからか。

確かに、作ったばかりのときはまだAuthComponentを適用させていませんでしたからね。ただ登録ができるってだけで、実際に会員のログイン処理を入れたのはだいぶ経ってからのこと。

うん、確かにね、前にも同じようなことがあったから、むしろ何で今回はハッシュ化されずにデータが送信できているんだろうと、疑問に思わなかったわけではないんですよ。本当だよ? でもまあ、登録されるまではハッシュ化されない方が都合が良かったから、何かよく分かんないけど良いやって思ってほっといたんです。

まあそういうわけなので、これを回避するにはテキストフィールドに適当な名前をつけといて、データ送信時にハッシュ化した値をパスワードとして使っているフィールドに入れなおすとか、AuthComponentのフィールドを別の名前に変えておくとか、そういう方法を取る必要がありますね。

//例1
//ビュー
echo $form->password('pass');

//データ登録時(コントローラー)
$this->data['Model']['password'] = $this->Auth->password($this->data['Model']['pass']);

//例2
//コントローラー
$this->Auth->fields = array('username' => 'username', 'password' => 'pass');

//ビュー
echo $form->password('password');

すごい端折った書き方ですが、こんな感じでしょうか。

しかし、やはりと言うべきか、よく分かんないけど望むとおりに動いてるから何となくオーケーだ、で物事を済ますのは、よろしくないですね。今回、そのことを再認識した次第にございます。

もっとちゃんと考えよう(今後の人生とか)

3 0 0 0