setLayout()はそういうことだったのか・・・(CakePHP修行 #021)

以前の記事で悩んでいたsetLayout()の謎ですが、青い人がブログで教えてくれました。 今日現在の1.2の最新版ではsetLayout関数は廃止されています。非推奨状態から廃止に至ったようですね。 つまりsetLayout()は使わなくていい、ということですね。悩んだだけ損した・・・でもすぐにあきらめたのでよかったw。 いつもながら突っ込みありがとう!>青い人。 » [CakePHP] ログイン認証まとめ・レイアウトの切り替え方とsetLayout関数 : akiyan.com ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ログイン画面のセキュリティを考える(CakePHP修行 #020)

さてさてログインフォームの改善を続けます。 次はセキュリティ関連。気になる点は以下の二つ。 ログイン画面ってわけではないですが、パスワードを平文で保存しているのが不安。ハッシュ化したいところ。 不正な入力値がないようになにか対策をすべきかどうか?するならどうする? ■ パスワードのハッシュ化 まず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で作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ログインでエラーが出た時に情報を保持したい(CakePHP修行 #019)

さてログインフォームの改善を続けます。 ログインフォームでは間違えた情報を入力したときに前回入れた情報を保持しておいてもらいたいですよね。ただしパスワードはいろんな意味で保存したくないので、パスワードフィールドだけは情報を保持しないようにしてみたいと思います。 さてそこらへんを調べようと思ったら青い人から神の声が。 htmlヘルパー使っていると、多分自動で保存されるはず・・・。 そ、そうだったのか・・・というわけでテストしてみると・・・確かに。 ただ、逆にパスワードも保持されてしまうので、そこは明示的に空にしてあげます(← これも教わった)。 ソースは/app/views/users/login.thtmlです。 <tr><td width="40%" align="right">password</td><td><?php echo $html->password(‘User/pwd’, array(‘size’ => 20, ‘value’ => ”)); ?></td></tr> これでテストしてみたら・・・できた!これもささっと終わりましたね。 さてでは次へ行きましょう! ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

htmlspecialcharsはhでOKらしい(CakePHP修行 #018)

さて青い人とチャットしていた知った事実。 CakePHPでは htmlspecialchars は h() でOKらしい。よく見たら技術評論社の彼の連載にもそう書いてあった・・・。 というわけで表示系のソースを改変。h() を使って安全に表示させるようにしました(つか、前回気づけよ、という噂も・・・)。 /app/views/users/home.thtmlです。 <div id="my_page" class="clear"> <h2><a href="/users/home/"><?= h($me[‘User’][‘name’]); ?></a></h2> <div id="contents"> <div id="menu" class="clear"> <ul> <li><a href="/users/home">Home</a></li> <li><a href="">Diary</a></li> <li><a href="">Friends</a></li> <li><a href="/users/edit/">Settings</a></li> <li><a href="/users/logout/">Logout</a></li> </ul> </div><!– /menu –> <h3>My Profile</h3> <div id="my_profile" class="clear"> <img src="100shiki.jpg" width="50" height="50" border="0" alt="" /> <p><?= h($me[‘User’][‘profile’]); ?></p> </div> </div> </div> さて、では次はログイン系の処理をば。 ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ログイン処理をつきつめて考えてみる(CakePHP修行 #017)

さて次に何をすべきか迷いましたが、ログイン処理をいろいろやってみたいと思います。 実現したい機能は以下のとおり。 セキュリティを高めたい(悪意のあるコード入力の阻止、md5とか使ってなんか?)。 エラーになった場合、前回入力したメアドは保持したい。 「情報を保存する」機能の実装。 「パスワードを忘れた場合」の処理。 クリックしたURLを保持しておいて、ログイン後にHomeじゃなくて、そのURLに行くように処理。 ちょっとした機能ではありますが、なんかノー・アイデアですなw。ここらへんでもう一度レファレンスを読み返したいと思います。 次の更新はいつかなぁ・・・週末にもう一回ぐらいかな。お楽しみに。 ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ログアウト処理をやってみる(CakePHP修行 #016)

さて次はログアウト処理。これは簡単っぽい。 /app/controllers/users_controller.phpに次の記述を追加。   function logout()   {     $this->Session->delete(‘my_id’);     $this->redirect(‘/users/home/’);   } で、ログアウトリンクには /home/users/logout を設定。クリックしてみます。 ↑ 右上のログアウトをクリックして・・・。 ↑ ログアウトできましたー。 ログアウトついでにもう一つのテストアカウントでログイン。 ↑ こちらもOK。ちゃんとユーザーが切り替わっていますね(表示名がakiyanになりました)。 さてさて、今回は簡単でしたね。次はプロフィール編集に行くか、ログイン処理を作りこんでいくか・・・どっちにしようかなー。 ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ホーム画面もカスタマイズしたい(CakePHP修行 #015)

前回まででログイン画面がカスタマイズできたので勢いにのってホーム画面もカスタマイズ。 /app/views/layout/home.thmlを作って変数を埋め込んでいきます。 <div id="my_page" class="clear" style="border:4px solid #ececec"> <h2><a href="/users/home/"><?php echo $me[‘User’][‘name’]; ?></a></h2> <div id="contents"> <div id="menu" class="clear"> <ul> <li><a href="/users/home">Home</a></li> <li><a href="">Diary</a></li> <li><a href="">Friends</a></li> <li><a href="/users/edit/">Settings</a></li> <li><a href="/users/logout/">Logout</a></li> </ul> </div><!– /menu –> <h3>My Profile</h3> <div id="my_profile" class="clear"> <img src="100shiki.jpg" width="50" height="50" border="0" alt="" /> <p><?= $me[‘User’][‘profile’]; ?></p> </div> </div> </div> こんな感じかな・・・。 で、ログイン。 ↑ おー!やったぜ! ちょっとわかりにくいですが、きちんとユーザー名が表示されていますね。今のところプロフィールには何も入っていないので空白でOKかと。プロフィール画像をどうするか、とか考えるところは多々ありますが、まぁ、今のところはこれで。 さて次はログアウト処理でもやってみますかね。 ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

画面をカスタマイズしたい(CakePHP修行 #014)

さて今回は画面のカスタマイズをします。参考にしたのはこちら。 » CakePHP Manual いくつかポイントがありそうです。 /app/views/layout/default.thtmlを作ればそれがデフォルトのレイアウトを上書きしてくれるらしい。 titleタグの中身はcontroller中に$pageTitleで指定すればいけるらしい(つか、レイアウト中の変数をControllerで指定できるつうことか) レイアウトは複数作って$layoutで切り替えられるらしい。 レイアウト中の小さなパーツは/app/views/elementsに入れておいて使い回しできるらしい。 なるほど。つうことで以下をやってみます。 /app/views/layout/default.thtmlを作って以前作ったレイアウトを適用させます。 ページタイトルを適宜変更します(LoginとMy Homeかな)。 $layoutの切り替えをしたいので、なにかでテストします。 ヘッダーとフッターは/app/views/elementsにいれてレイアウト中から使ってみます。 ■ やってみた結果 前回までのログイン画面はこんな感じでした。いけてません。 ↑ ま、デフォルトですね。 そこで/app/views/layout/default.thtmlを作ってみます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="keywords" content=""> <meta name="description" content=""> <link rel="stylesheet" href="/css/core.css" type="text/css" /> <link rel="shortcut icon" href="/favicon.ico" /> <title><?php echo $title_for_layout?></title> </head> <body> <div id="container" class="clear">  <div id="header" class="clear"> <h1><a href=""><img src="/img/codexcode_logo.png" width="400" height="50" border="0" alt="" /></a></h1> </div> <?php echo $content_for_layout ?> </div><!– end of container –> <div id="footer"> <p>Copyright 2007 code*code.com, All rights reserved.</p> </div> </body> </html> それから必要なCSS、画像は/app/webroot以下に配置します。そしておもむろにhttp://www.codexcode.com/にアクセス! ↑ キタコレ! そしてuser_controller.phpのlogin()に$pageTitleを入れてみます。   function login()   {     $this->pageTitle = ‘Welcome to CODE*CODE!’;     $this->set(‘error’, false); そしてアクセスすると確かにタイトルタグが変更されました。これは問題なし。 次にヘッダーとフッターをelementにしてみたいと思います。/app/views/elements/header.thtml、/app/views/elements/footer.thtmlを作ってみます。そしてdault.thtmlの方には次のように記述。 <div id="container" class="clear">  <?php echo $this->renderElement(‘header’); ?> <?php echo $content_for_layout ?> </div><!– end of container –> <?php echo $this->renderElement(‘footer’); ?> そんでもってアクセス。これもうまくいったっぽいです。elementsでは変数とか渡せるようですが、それは後々使うことにしましょう。 ■ レイアウトの切り替えがわからない さてここまでは順調ですが、ちょっとはまった点(そしてまだ解決していない)。 わからないのはsetLayout()の使い方。マニュアル上ではレイアウトファイルを複数作って切り替えることが可能、とあります。そこでLogin中は/app/views/layout/login.thtmlを使いたいと思い、次のように記述しました。   function login()   {     $this->setLayout(‘login’);     $this->pageTitle = ‘Welcome to CODE*CODE!’;     $this->set(‘error’, false); すると・・・。 ↑ なんかエラー・・・なぜだ? とんでもないケアレスミスのような気がしないでもないですが・・・まぁ、恥をかくのが修行の目的なんでさらしておきます・・・。もちょっと調べてわかったら報告しますね。 しかし今のところ特に必要な機能でもないので、問題解決に飽きたら次のステップに進んじゃいますw。 ※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

トップ画面を指定したい(CakePHP修行 #013)

さてCakePHP。前回までのあらすじはこちら。 » CakePHP修行! アーカイブ | i d e a * i d e a 前回まででなんとなくログインがうまくいきました。で、できれば http://www.codexcode.com/ にアクセスしたときに http://www.codexcode.com/users/home/ になってほしいのでそのように設定してみます。 参考にしたのはこちら。 » A.13. Routes(ルート) これを使えばうまくできそうです。早速/app/config/routes.phpを変更してみます。 $Route->connect(‘/’, array(‘controller’ => ‘users’, ‘action’ => ‘home’)); テストしてみると思ったように動作してくれているようです。簡単ですね。 さて次はテンプレートのカスタマイズですね。さて、どっから調べるか・・・。

ログイン画面をデバッグする(CakePHP修行 #012)

さてCakePHP。前回までのあらすじはこちら。 » CakePHP修行! アーカイブ | i d e a * i d e a で、前回まででログイン画面をざっくり動作させようとしたのですが、なんだかエラーが出てうまくいきませんでした。 うっかり「CakePHP修行終了~」エントリーを書こうと思いましたがw、青い人がフォローしてくれたので続けたいと思います。ありがとう!青い人。すごい勉強になっている! ちなみにつっこんでもらったエントリーはこちら。 » Re: CakePHP修行 #011 無限リダイレクトに気をつけろ : akiyan.com ポイントはいくつか。 「ブラウザの不正リダイレクトは無限ループが原因」ってことが多いらしいことを知りました。 ControllerのbeforeFilter()の挙動について学んだ。 解決方法についてアイディアをもらった。 うむ。かなりのぽかミスにもかかわらず「よくあるミス」となぐさめてくれた青い人に感謝感激。教え上手ですな。さすが開発チームのリーダー。 ではでは気を取り直していってみます。 ■ 今回の作業計画 いろいろ考えた結果、今回は以下をやってみます。 前回のエラーに関しては単純にbeforeFilterを使わずに、ログインが必要なアクションについてその都度checkSession()を呼ぶようにしたいと思います。 現在Sessionに保存されている情報は’User’で、User情報全部なのですが、IDだけでいいだろ、ということで’my_id’をログイン後にセッションに保存するようにします。そうしないとユーザー情報が変わった時に全部セッション書き換えないといけないので。 users_controllerにhome()を足します。home()は自分のホーム画面を表示するためのものです。 http://www.codexcode.com/にアクセスすると自分のホーム画面に行くように設定してみます。 ヘッダーとフッターのテンプレートを変更して画面をかっこよくします。 さてがしがしやりましょう。 ■ セッション関連、home()など まずはController。beforeFilter()を削除し、ログインの挙動を変更し、home()を追加します。 /app/controllers/users_controller.phpは以下のように。   function home ()   {     $this->checkSession();     $this->set(‘me’, $this->User->findById($this->Session->read(‘my_id’)));   }   function login()   {     $this->set(‘error’, false);     if (!empty($this->data))     {       $someone = $this->User->findByEmail($this->data[‘User’][’email’]);       if(!empty($someone[‘User’][‘pwd’]) && $someone[‘User’][‘pwd’] == $this->data[‘User’][‘pwd’])       {         $this->Session->write(‘my_id’, $someone[‘User’][‘id’]);         $this->redirect(‘/users/home/’);       }       else       {         $this->set(‘error’, true);       }     }   } セッションの変更に合わせて/app/app_controller.phpも変更。 <?php class AppController extends Controller {     function checkSession()     {         // If the session info hasn’t been set…         if (!$this->Session->check(‘my_id’))         {             // Force the user to login             $this->redirect(‘/users/login’);             exit();         }     } } viewも追加しないといけませんね。/app/views/users/home.thtmlも作ります。とりあえずデータをDumpするだけで。 <?php   var_dump ($me); ここまでを一気に完了。テストしてみます。 まずは /users/home/ にアクセス。 ↑ ちゃんとログイン画面がでました! ↑ 無事ログインすると自分の情報が! さて、次はURLの挙動とテンプレートについて作業してみます。長くなるのでエントリーわけよっと。