HTML Purifier

(まとめ中)

投稿されたテキストデータをHTMLコードとして出力したい(せにゃならん仕様である)場合、付きまとう問題であるXSS
クロスサイトスクリプティング対策として最終的に行き着くところは、投稿データをHTMLとしてパースし、パース結果を持ってしかるべきサニタイズ(無力化)を実施するという手段である。

※不特定多数が投稿するようなプログラムはほとんど書かないし、書いてもHTML要素はhtmlspecialcharsする。

http://htmlpurifier.org/download.html
http://htmlpurifier.org/svnroot/htmlpurifier/tags/3.1.1/INSTALL
http://d.hatena.ne.jp/teracc/20070105#1168070785
http://blog.livedoor.jp/katz_stlips/archives/51359633.html

ライブデモ

http://htmlpurifier.org/demo.php
※ここで動作設定項目を決めていくといいかも。

基本的な使用方法

<?php

//HTML_Purifier の本体読み込み
require_once(LIB_ROOT.'/htmlpurifier/library/HTMLPurifier.auto.php');

//動作設定
$__HTMLPurifierConfig = HTMLPurifier_Config::createDefault();
$__HTMLPurifierConfig->set('HTML', 'Doctype', 'HTML 4.01 Transitional');
$__HTMLPurifierConfig->set('Core', 'Encoding', 'EUC-JP');
$__HTMLPurifierConfig->set('Core', 'Language', 'ja'); 
$__HTMLPurifierConfig->set('AutoFormat', 'AutoParagraph', true); 

//文字列の消毒実行
$__HTMLPurifier = new HTMLPurifier($__HTMLPurifierConfig);
$cleanString = $__HTMLPurifier->purify($string);

?>

Aタグのtarget属性が取れちゃう件に対応する

<?php

(前略)

//動作設定
$__HTMLPurifierConfig = HTMLPurifier_Config::createDefault();
$__HTMLPurifierConfig->set('HTML', 'Doctype', 'HTML 4.01 Transitional');
$__HTMLPurifierConfig->set('Core', 'Encoding', 'EUC-JP');
$__HTMLPurifierConfig->set('Core', 'Language', 'ja'); 
$__HTMLPurifierConfig->set('AutoFormat', 'AutoParagraph', true); 

//AllowedFrameTargets というやつ。デフォルトでは全てカットしている。
// このほかにも特定属性値(?)についての設定が可能な模様。
//   http://htmlpurifier.org/live/configdoc/plain.html#Attr.AllowedFrameTargets
$__HTMLPurifierConfig->set('Attr', 'AllowedFrameTargets', array('_blank','_self'));

(後略)

?>

動作設定について

なんだか設定項目が盛りだくさんなの。ドキュメントを読めばいいと思うの。
http://htmlpurifier.org/live/configdoc/plain.html

Smartyの修飾子として使う。

多分...こういう使い方は....大丈夫な....はずだ!

<?php
/* FileName : ~/smarty/plugins/modifire.XSS_Disable.php
 * Desc.    : smarty::HTMLコードを限定的に表示可能とする修飾子
 */
require_once('/somewhere/absolute/path/to/htmlpurifier/library/HTMLPurifier.auto.php');
$__HTMLPurifierConfig = HTMLPurifier_Config::createDefault();
$__HTMLPurifierConfig->set('HTML', 'Doctype', 'HTML 4.01 Transitional');
$__HTMLPurifierConfig->set('Core', 'Encoding', 'EUC-JP');
$__HTMLPurifierConfig->set('Core', 'Language', 'ja'); 
$__HTMLPurifierConfig->set('AutoFormat', 'AutoParagraph', true); 
$__HTMLPurifier = new HTMLPurifier($__HTMLPurifierConfig);

//他の修正子ファイルなどと一緒のディレクトリに保管しておけば、自動的に読み込まれる。
//$Page->register_modifier('XSS_Disable','smarty_modifire_XSS_Disabled');
function smarty_modifire_XSS_Disabled($string)
{
  global $__HTMLPurifier;
	
  $cleanString = $__HTMLPurifier->purify($string);
  return $cleanString;
}

?>