2007/12/5 水曜日

Smartyでescape

Filed under: Smarty — admin @ 20:42:16

SmartyでXSS対策で、デフォルトでhtmlspecialcharsをかけるには

$smarty->default_modifiers = array('escape:"html"');

とすればいいが、
foreachをまわすとエラーが出てしまう。

原因は

Smarty/plugins/modifier.escape.php

が配列に対応していないから。
だいぶ前に話しには聞いていたのだけど、まだ対応してなかったのね。

対応策は

        case 'html':
            if(is_array($string)){
              return array_map('htmlspecialchars',$string);
/*
              return array_map(
                       'htmlspecialchars',
                       $string,
                       array_fill(1,count($string),ENT_QUOTES),
                       array_fill(1,count($string),$char_set)
                     );*/   

            }else{
              return htmlspecialchars($string, ENT_QUOTES, $char_set);
            }

として、array_mapを使って配列に対応する。
array_mapは引数が1つの時には便利なのだが、2つ以上になると処理が非常に面倒になる。
なのでここでは、キャラセットなどの引数は無視して、引数を1つとしている。
※ コメント部分はこのなごりです。ちなみにこれは未完成なのでまともに動きません。
一応解説しておきますと、array_mapは引数すべてが配列でなければいけないので、
例えば引数1だけ配列で、引数2以降は固定というよくあるパターンのときに非常に困ります。
そこで、引数2以降はarray_fillを使って引数1の配列の分をcountして配列を生成
しているのがコメント部分なのですが、実はこれだとダメなのです。
というのは、さらに多次元配列だった場合にこれだと対処できないからです。
もし本当に完璧に処理したいのであればPHP マニュアルの
array_map関数のユーザー投稿にそのものずばりがあるので参考にしてみてください。
さらに、foreachで2重にエスケープがかかっちゃうので、その時は
foreach中で|smarty:nodefaultsをかけておくように。

{foreach from=$html|smarty:nodefaults item=tag}
{$item}
{/foreach}

■ 参考リンク

No Tags

2007/12/2 日曜日

日曜プログラミング講座/PHP言語 - テンプレート編 - Water-Sunlight

Filed under: Smarty — admin @ 9:31:32

日曜プログラミング講座/PHP言語 - テンプレート編 - Water-Sunlight

No Tags

2007/11/7 水曜日

WordPress with Smarty

Filed under: Smarty, wordpress, php — admin @ 3:28:58

WordPress with Smarty

No Tags