tDiary 2.2.2 およびそれ以前のバージョンにクロスサイトスクリプティング(XSS)脆弱性が発見されたため、tDiary 2.2.3 がリリースされました。
これに伴ない、第三tDiary.Netで稼働している tDiary も 2.2.3 へバージョンアップしました。特に動作に影響はないと思いますが、何かあればこの日記にツッコミをお願いします。
なお、脆弱性についての詳細は、tDiary開発プロジェクトによる下記の記事を参照してください。
ひさびさに CakePHP を触っているんだけど、自作 Component の中から CookieComponent を呼んだときに、ちょっとハマってたので記してみる。
Cookie Component の基本的な使い方はこんな感じ。
<?php class SamplesController extends AppController { var $name = 'Samples'; var $uses = array(); var $components = array('Cookie'); function beforeFilter() { $this->Cookie->name = 'samplecookie'; $this->Cookie->time = 3600; } function test() { $this->Cookie->write('hoge', 'fuga', FALSE); } } ?>
これで /samples/test へアクセスしたときに発行される Cookie はこのようになる。
Set-Cookie: samplecookie[hoge]=fuga; expires=Thu, 25-Feb-2010 15:25:58 GMT; path=/
$this->Cookie->name で設定した samplecookie が Cookie 名に入っており、$this->Cookie->time で設定した値を元に expires の日時が入っているのが分かる。
次に自作の Component の中から Cookie コンポーネントを呼び出して、使ってみる。Controller では、自作 Component だけを呼び出すようにしている。
<?php class SamplesController extends AppController { var $name = 'Samples'; var $uses = array(); var $components = array('Original'); function test() { $this->Original->func1(); } } ?>
Component の中からは、別の Component を呼び出す場合、Controller と同じように $components へ指定してやれば良いことになっているので、自作の Component からは、このように Cookie Component を呼び出した。
また、Component には beforeFilter() が無いので、initialize() に Cookie Component の設定を書いてみた。
<?php class OriginalComponent extends Object { var $components = array('Cookie'); function initialize(&$controller) { $this->Cookie->name = 'samplecookie'; $this->Cookie->time = 3600; } function func1() { $this->Cookie->write('hoge','fuga',FALSE); } } ?>
このコードで発行された Cookie は、最初のコードと同じように Cookie 名と expires がセットされることを期待していたのだが、実際に吐き出された Cookie には expires が付いていなかった。
Set-Cookie: samplecookie[hoge]=fuga; path=/
なんで?なんで?なんで?としばらく悩んでいたのだが、Cookie Component の中身を見て、ようやく分かった。
$this->Cookie->time で設定した値は、Cookie Component 内の startup() でのみ利用されており、また、startup() は Controller から呼ばれた場合に実行される処理らしい*1ので、上記のように initialize() などで time をセットしても、この値は利用されないのであった。
じゃあ、どうすれば良いのか?であるが、$this->Cookie->write() の第4引数に expires 設定を書いてやれば、やりたいことはできる。
<?php class OriginalComponent extends Object { var $components = array('Cookie'); function initialize(&$controller) { $this->Cookie->name = 'samplecookie'; } function func1() { $this->Cookie->write('hoge','fuga',FALSE, 3600); } } ?>
このコードを実行すると expires 付きの Cookie を発行してくれる。
Set-Cookie: samplecookie[hoge]=fuga; expires=Thu, 25-Feb-2010 15:54:42 GMT; path=/
$this->Cookie->name も利用されないなら、割と早く気がついたかも知れないんだけど、$this->Cookie->time だけが利用されない状態だったので、意外とハマって、悩んでしまったよ。
*1 コードは未確認。実行状況で確認した。