いつか作ります RSSフィード

2009-02-04

[]SmartyでXSS脆弱性を100%防ぐ方法 03:08 SmartyでXSS脆弱性を100%防ぐ方法 - いつか作ります を含むブックマーク はてなブックマーク - SmartyでXSS脆弱性を100%防ぐ方法 - いつか作ります SmartyでXSS脆弱性を100%防ぐ方法 - いつか作ります のブックマークコメント

まあ、糞入門レベルなのだが、身近でXSS出しすぎな人が多いので。ちなみに100%は四捨五入した値だ。

class MySmartyWrapper{
  private $smarty;
  function __construct(){
    $this->smarty = new Smarty();
    // その他、各種設定
  }
  function assign($varname, $var){
    return $this->smarty->assign($varname, htmlspecialchars($var));
  }
  function fetch($tpl){
    return $this->smarty->fetch($tpl);
  }
}

アサインした瞬間に全てエスケープされるようにしておけば確実。薄い層を一枚噛ませる。

自分で使っているクラスには、エスケープの有無を切り替えられる&配列要素の再帰的エスケープも可能な処理を追加してある。オブジェクトを扱うのは厳しいが*1

要は「デフォルトが危険、ひと手間かけると安全」なのが悪いのであって、「デフォルトで安全で、危険な事をするにはひと手間かける必要がある」状態にすれば安全性は飛躍的に向上する。

本来はエスケープはテンプレートエンジンの仕事ではあるのだが、安全性の名の下にはこの程度の越権は許容されて然るべき。

追記

http://www.phppro.jp/phpmanual/smarty/variable.default.modifiers.html

$smarty->default_modifier = array('escape', 'nl2br');

Smarty側に機能が存在した。が、バグいっぱい夢いっぱいらしいので、結論としてはこんな糞テンプレートエンジンさっさと捨てようぜ、という事になる。

*1:オブジェクト渡しの場合も、マジックメソッドを上手く使うと9割方は何も考えずに可能なのだが

y_arimy_arim2009/02/09 09:49ユリイカくんだりで小理屈こね回してる自分が糞馬鹿に思えてきましたね。>コミュニティに何の価値も提供できない人間が、コミュニティから価値を認められるわけがない

新着エントリは上に追加。コメントは「はてなユーザのみ」、公開設定はパブリック (だれでも閲覧ができます)。