memo-space
CakePHP日記:requestActionとSecurityコンポーネント
- 2007-10-26
- php
なるほど。viewからrequestAction()を呼びだすのか。 なかなかよさそう。 と思ってたらSecurityコンポーネントとの組み合わせでハマってしまいました。
どうやらSecurityコンポーネントのrequireAuthを使ってると、requestAction()が呼ばれた時にセッション側のトークンが書き換えられてしまうので絶対トークンが一致しない様子。うーん困った。
あと、セッションの中にはトークンのキーと同時に有効期限が
セットされるんだけど、
Sessionコンポーネントの有効期限がCAKE_SECURITY * CAKE_SESSION_TIMEOUT
なのに、トークンの有効期限はCAKE_SECURITYだけで決まっちゃってる気がする。
- WriteBacks: 0
sortするならusort
- 2007-10-21
- php
個人的には、sortをするならusort()が好きです。 Perlをはじめ他の言語を使ったことがある人ならそう思うんじゃないかな。
- WriteBacks: 0
phpのinclude_pathのカレントディレクトリ
- 2007-10-15
- php
require("foo.php")とrequire("./foo.php")って意味違うって知ってました? cliから実行する場合以外はあまり関係無いかもしれませんが。
読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 (中略)ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。 (PHP: include - Manual)
- WriteBacks: 0
Smartyのtruncateはfunc_overloadでいいんじゃない
- 2007-06-15
- php
ずいぶん前からよく見かける話題だけど、また最近見かけたので。
いちばん手っ取り早いのは、mbstring.func_overloadを設定しちゃうことだと思いますよ。自分でプラグイン書く必要とか無いです。
- WriteBacks: 0
ファイルの直リンクを防止する方法をもう少し考えてみる
- 2007-05-31
- php
Refererを使わずに直リンクを防止する方法を考えてみます。
元ネタ: cl.pocari.org - PHP の apache_setenv と virtual を利用して,ファイルへの直リンクを防止する
この foo.php のファイル名を時間によって変えるなどすれば,まあ,直リンクを防止することができる……のかな?ちと強引ですが.
つまり、「直リンクを防止する」ことを考えるより「ある一定時間しか有効でないURLを作る」ことを考えれば良いということじゃないでしょうか。
で、foo.phpのファイル名を変えちゃうと、外部からの直リンクは防げても、内部からの普通のリンクを貼る時に困りそうです(それならぶっちゃけ、画像のファイル名そのものを時間によって変えちゃってもいいわけだし)。
なので、時刻をパラメータとして渡す方針で。
フェーズ1
foo.php?t=....のようにfoo.phpにタイムスタンプを渡す- foo.phpの中で
$_GET['t']と現在時刻を比較し、n分以上たっていればはじく - でもこれじゃ簡単に偽装されちゃうYO!
なので、フェーズ2
- foo.phpにタイムスタンプと、(タイムスタンプ+秘密鍵)のHMACを渡す。
- foo.phpの中で、(タイムスタンプ+秘密鍵)のHMACを再計算して、渡ってきたHMACと一致するかチェック。
- foo.phpの中で
$_GET['t']と現在時刻を比較し、n分以上たっていればはじく
な感じじゃないでしょうか。本当はapache moduleとかで書いた方が楽そうですが。
- WriteBacks: 0
PHPを3ヶ所だけ直すとしたら
- 2007-05-22
- php
PHPについてはいろいろありますが手短に釣られて見ます。
PHPのあれが駄目とかじゃなく、 もし神様(何の?)が、今までのは無かったことにしてPHPをどこでも3ヶ所直していいよっていったらどうするかってのを聞いてみたいです。
- WriteBacks: 2
CakePHP日記:PostgreSQLのportを指定する
- 2007-04-16
- php
app/config/database.phpのコメントに惑わされてはいけません。
/*
...
* host =>
* the host you connect to the database
* MySQL 'localhost' to add a port number use 'localhost:port#'
* PostgreSQL 'localhost' to add a port number use 'localhost port=5432'
*
*/
実は'host' => 'localhost port=5432'ではなく'port' => 5432を追加すればOK。
- WriteBacks: 0
CakePHP日記:CakePHPでSmartyを使う時のTips
- 2007-04-11
- php
2007-04-12 追記:※注意!結論の「バッククォートで括ると便利」というのはあってますが、そこまでの過程はほとんどウソでした。そのうち直します。
CakePHPでViewにSmartyViewを使う時、おおざっぱにいうとこんな動きになっています。
- コントローラがビューに変数を渡す
- ビューがSmartyに変数を渡す(ついでに自分自身をviewというSmarty変数に登録する)
- レンダリング
このように、変数のコピーが2度発生します。
{$post.id} // これはSmartyの変数
{$html->link('linkto', $post.id)} // この$postはPHPの(SmartyViewがセットした)変数
ここで困るのは、レンダリング中にセットされた変数はSmartyの世界からしか見えないこうことです。 典型的な例としてはループで使われる変数です。
- WriteBacks: 0
CakePHP日記:Model,View,Controllerを共有する
- 2007-04-09
- php
同じmodel/actionに対して、一般ユーザ向け画面と管理者向け画面を分けたい時、CakePHPではAdmin Routingという選択肢があります。
4.4. 高度な Routing 設定: Admin Routing と Webservices
なんだけども、アプリケーションを分けてしまった方がすっきりする場合もあります。 分けてしまった場合でも、特にModelのクラスは同じもの使うことが多いです。こういう場合はファイルをコピーしなくても、app/config/bootstrap.phpでModelを検索するパスを$modelPaths 複数指定することができます。
- WriteBacks: 0
文字列の先頭と末尾を表わす正規表現
- 2007-04-08
- php
そういう時は普通、\zを使うんだと思う(元記事のコメント欄でも言及されてるみたいだけど)。
- preg_matchの注意点 - PHPプロ!ニュース
Holes in most preg_match() filters - PHP Security Blog
<?php $str_list = array( "OK" => "1234:XYZ", "OK_EOL" => "1234:XYZ" . PHP_EOL, "NG_1" => "1234:XYZ" . PHP_EOL . "aaa" ); foreach ($str_list as $k => $v) { if (preg_match("/^[0-9]+:[X-Z]+\z/", $v)) { echo $k . " => " . $v; echo PHP_EOL . "----------------" . PHP_EOL; } } ?>
という話を書こうと思ったらPerl6では\Aと\zは廃止だそうです。
^と$が\Aと\z相当の動作をするらしい。
- WriteBacks: 0
CakePHP日記:insertかupdateか
- 2007-04-05
- php
Model#save()は、idがセットされているかどうかでinsertかupdateかを判断しているようです(さらに、lidがセットされていれば、本当に存在するかをSELECTしてみています)。
ですが、一般的なコントローラのeditアクションは、
A.12. Posts の編集:CakePHP プログラマーズ リファレンスガイド
function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
}
else
{
if ($this->Post->save($this->data['Post']))
{
$this->flash('投稿を更新しました。','/posts');
}
}
}
こんな感じで、データがpostされた場合はidをセットしていません。
ではなぜこれをupdateと判断するかというと、URLの1つめのパラメータは暗黙でデフォルトのモデルのidにセットされるからです。
じゃなくってこのドキュメントの例では、idをhiddenで渡しているからでした。
で、このhiddenが無い場合の話が以下に続きます。
しかし、コントローラでvar $uses = array('Model1', 'Model2')などと明示的に使うモデルを指定していると、この暗黙のidのセットは動作しないようです。
なので、uses を指定している時や、URLの1つめのパラメータをデフォルトのモデルのidとして使いたくない場合は、明示的にidをセットしましょう。
- WriteBacks: 0
CakePHP日記:SmartyからHTMLヘルパーの属性を指定する
- 2007-04-03
- php
前回の続き。 実は、
<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>
こんなことしなくても、HTMLヘルパーのメソッドはたいてい、attributeにarrayじゃなく文字列を渡すこともできるらしく、
<p>Title: {$html->input('Post/title', 'size="40" class="classname"')}</p>
でいいんじゃないかということに気づいた。
2007-04-03 追記
やっぱダメだった。inputみたいなフォームの部品に関しては、valueとかidを付けてくれない。$html->image() なんかには使ってもいいかもしれない。
- WriteBacks: 0
CakePHP日記:Smaryテンプレート内での配列生成
- 2007-03-29
- php
CakePHPからSmartyを使うのは一見いいとこどりのようで、実際結構大変かもしれない。
- How to use Smarty with Cake (SmartyView) | The Bakery, Everything CakePHP : Articles
- MOONGIFT ブログ ≫ cakePHP覚書 (1)
素のCakePHPだと
<p>Title: <?php echo $html->input('Post/title', array('size'=>40, 'class'=>'classname'))}</p>
みたいな感じのものを、Smartyテンプレート内では配列を生成できないので、
{assign_assoc var='ArrayName' value='size=>40,class=>classname'}
<p>Title: {$html->input('Post/title', $ArrayName)}</p>
と書こうという話。そんなassignは個人的に許せないわけですよ。 CakePHPのbasic.phpにはaとかaaとかhとかprとか色々便利な関数があるのと、 Smartyテンプレート内では関数を自由に呼び出すことはできないけど、 テンプレート変数のメソッドなら治外法権という性質を利用して、 SmartyViewにラッパーメソッドを追加。
function aa() {
$args = func_get_args();
return call_user_func_array('aa', $args);
}
SmartyViewのインスタンスは$viewとしてテンプレート内から参照できるので、
<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>
と書くことができる。邪道な気もしますが。あと、同様にprも追加しておいた。
あと、テンプレート変数をヘルパーの引数に渡したい時とかどうしよう(ループカウンタとか)。
$view->Smarty->get_template_vars()かなぁ。どんどん道を外れていく気がする。
2007-04-03 追記:CakePHP日記:SmartyからHTMLヘルパーの属性を指定する
- WriteBacks: 2
CakePHP日記:radioにlabelを付ける
- 2007-03-27
- php
デフォルトのHtmlHelper::radio()が出力するラジオボタンにラベルが無いので付けた。 誰もがやりたくなる改造だと思います。
ヘルパーが出力するHTMLタグは、app/config/tags.ini.phpでカスタマイズできますが、 <label for="...">と書くにはヘルパー側に手を入れる必要があるので、 安易にapp/config/tags.ini.phpをこんな感じにしてみました。
radio = <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>
- WriteBacks: 1
- Search
- Feeds
- Profile
- 石田@苫小牧市と名乗りつつ札幌の某社に勤務するプログラマ
- 書いた本
- Links