[PHP-users 31481] Re: value属性への変数展開

goungoun gounx2 @ gmail.com
2007年 2月 17日 (土) 22:24:46 JST


こんにちは。

On Sat, 17 Feb 2007 20:29:31 +0900
Ryo Suyama <ryo @ spais.jp> wrote:
> > # あるときは、エスケープ済み、あるときは未 とかになると
> > # エスケープ忘れたり、2重エスケープしてしまいそうです。
> 
> 僕の場合はリクエストパラメータをたらいまわしにはせずに、検証用クラスで検
> 証を行ったうえでさらにエスケープ処理も施します。
> 
> $_POST = array('tag' => '<a href="http://yahoo.co.jp">Yahoo!</a>')
> $Smarty = new Smarty();
> だとして
> 
> $post = new valid($_POST);
> if($post->is_exists('tag') && $post->valid_html('tag')){
> 	$Smarty->assign('text',$post->escape_html('tag'));
> }
> 
> というような実装にしています。
> #boolean valid::is_exists() メソッドは要素の有無を確認
> #boolean valid::valid_html() メソッドは要素の値が HTML のタグとして正しいかを検証
> #string valid::escape_html() メソッドは要素の値を htmlspecialchars して返す

なるほど。
どのメソッドを使っているか?で、生なのか、エスケープしてるのか
すぐわかるということですね。

> 
> Smarty に限らずテンプレートエンジンで値を書き換えてしまうと、スクリプト
> とテンプレートの両方で確認をしなければならず、それは僕にとってはとても面
> 倒です。
> また「この時のこの値はエスケープしたっけなー?」という確認も面倒くさいの
> で基本的に上記のように valid::escape_html() メソッドの返り値がエスケープ
> 処理された値で、生データは基本的にそのまま残しています。

んー
私的には「テンプレートエンジンで値を書き換えてしまう」という
認識よりも「テンプレートエンジンに任せる」という感じでいるので、
面倒なこととは感じないのですが、そこは人それぞれかもですね。


ちなみにFlexyの場合だと、

こんな感じです。
(適当に書いたので、コピペでは実行できないような気がしますが)

----------------------------------------------------------
$flexy = & new HTML_Template_Flexy();
$flexy->compile('template.html');
$obj = new StdClass;
$obj->item1 = '<a href="http://yahoo.co.jp">Yahoo!</a>';
$obj->item2 = 'あいてむ2';

$flexy->outputObject($obj);
----------------------------------------------------------

template.html
----------------------------------------------------------
<html>
<body>
<p>エスケープあり:{item1}</p>
<p>エスケープなし:{item1:h}</p>

データの有無で表示変えるなら
<p flexy:if="item2">{item2}</p>

</body>
</html>
----------------------------------------------------------

$objレベルでは、全部生でデータ持ってて、
Flexy側にエスケープを*任せる*という感じでいます。



-- 
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/



PHP-users メーリングリストの案内