nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

XSS対策

本家のほうで便利なpluginが出来たようです。こちらを使いましょう。
そういやこのままだとHTMLタグそのまま出力されちゃうじゃん!というわけでEthnaっぽくしたHtmlParserが以下

<?php
require_once("Rhaco.php");
Rhaco::import("tag.HtmlParser");
Rhaco::import("lang.Variable");
Rhaco::import("tag.data.TemplateFormatter");

class HtmlParserEscape extends HtmlParser {
	function setVariable($arrayOrKey,$value=""){
		if(isset($this) && Variable::isClassType("TagParser",$this)){
			if(Variable::isClassType("Request",$arrayOrKey) && method_exists($arrayOrKey,"getVariable")) $arrayOrKey = $arrayOrKey->getVariable();
			if(!is_array($arrayOrKey)) $arrayOrKey = array($arrayOrKey=>$value);
			foreach($arrayOrKey as $key => $value) {
				$this->variables[$key] = TemplateFormatter::escape($value);
			}
		}
	}
	function setVariableNE($arrayOrKey,$value=""){
		return parent::setVariable($arrayOrKey, $value);
	}
}

元々HtmlParserAddOnFilterというのでエスケープできてたのですが、エスケープありとなしを使い分けたかったというのと、HtmlParserAddOnFilterが最近のバージョンで機能しなくなったということで、こういう形で書いてみました。しかしrhacoのソースのコピペ改変なので何かあったら泣きます。