SmartyでXSS対策を行う方法。
現状のお仕事はCMSを仕様に合わせてビジネスサイトを作るお仕事だが、このCMSが駄目コードであるが故にほとんど自作の俺々ライブラリ群を作っている状態になっている。まぁ僕はそっちの方が楽でいいんですが、仕様が最近までちゃんと決まってなかったので追加変更するカスタマイズがえらいことになっている。こりゃ、修羅場確定ですわ。死なないように頑張ろう。でもまぁ今の会社のやり方ははっきりは言わないけど、こんなやり方してたら修羅場は確実に発生するよねとは言いたい。僕は直接は言わないけどさ。業務改善はやりごたえがありそうでクラクラしますわ。
でもって表題。俺々ライブラリのView部分はSmartyで運用しているのですが、最近までセキュリティの事を考えてなかった。 XSS攻撃やCSRFを仕掛けてみたら普通に通るでやんの。これはまずいということで泥縄でセキュリティ対策を打っている。 フレームワーク使って楽なのはこんなところ省けることだよね。俺々ライブラリだとこういう所を手作業でやらないといけなくて面倒くさい。PHPのセキュリティまとめははまちちゃんの下記の記事が参考になる。
とはいえ、XSS攻撃対策はSmartyで運用していると楽だ。Smarty使えば出力側のHTMLタグは全部サニタイジングを挟むことができるんである。やり方は下記。
<?php
class SmartyWrapper {
public $smartyObj;
/**
* コンストラクタ
*/
public function __construct() {
$this->smartyObj = new Smarty();
$this->smartyObj->template_dir = __DIR__ .'/../smarty/template';
$this->smartyObj->compile_dir = __DIR__ .'/../smarty/template_c';
$this->smartyObj->config_dir = __DIR__ .'/../smarty/config';
$this->smartyObj->cache_dir = __DIR__ .'/../smarty/cache';
// XSS対策
$this->smartyObj->default_modifiers = array('escape:"html"');
return;
}
}
$obj = new SmartyWrapper();
$obj->smartyObj->assign('html_tag', '<h1>ほげほげ</h1>');
$obj->smartyObj->display('index.tpl');
こんなかんじ。出力側では{$html_tag}としてやると、htmlタグが大なり小なりに置き換えられた形で出力される。 普通にhtmlタグを出力したい場合は{$html_tag nofilter}とするとエスケープせずに出力される。
CSRF対策にはトークンかまして、SQLインジェクションにはプリペアドステートメントを挟む。この一手間が面倒くさいんですよねー。自分でWEBサービス作るんだったら、CakePHPなり使いますわ。
以上。
Smartyのassignで代入した変数をテストするときに楽する方法。 - 超メモ帳(Web式) PHPUnitで表示する内容をテストする。 - 超メモ帳(Web式) xdebugとWinCacheGrindを使ったPHPのプロファイル - 超メモ帳(Web式)