前の記事 ≪:CSS3のでのボックス要素デザインを圧倒的に簡単化できる「CSS3 Click Chart...
次の記事 ≫:アプリやWEBサイトに使えそうなフリーな244個のアイコンセット

PHPで予め許可したタグと属性以外を除去できるライブラリ「kses」

2010年06月28日-はてなブックマーク

スポンサード リンク
[PR] 英単語を忘却曲線アプリを使って超効率よく記憶する方法

kses - PHP HTML/XHTML filter | Download kses - PHP HTML/XHTML filter software for free at SourceForge.net



PHPで予め許可したタグと属性以外を除去できるライブラリ「kses」。
外部からの入力値は基本的にhtmlspecialcharsでタグを無効化するのが通常の考え方ですが、掲示板なんかで特定のタグを許可したいという場合があります。
PHPにはstrip_tagsというようなタグを除去しつつ、特定のタグのみを残すという関数が標準であったりしますが、これだと属性までは制御しきれません。
更には、<a href="***">の中身のプロトコルの指定なんかも制限することが可能になっています。

kses を使えば、次のように、許可したいタグを配列で定義するだけで、簡単かつ柔軟に除去したいタグのみの除去が可能です。

<?php
$val = $_REQUEST['message'];

$allowed = array(
    'b' => array(),
    'i' => array(),
    'a' => array('href' => array('minlen' => 3, 'maxlen' => 50), 'title' => array('valueless' => 'n')), 
    'p' => array('align' => 1, 'dummy' => array('valueless' => 'y')), 
    'img' => array('src' => 1), # FIXME 
    'font' => array('size' => array('minval' => 4, 'maxval' => 20)), 
    'br' => array()
);


$val = kses($val, $allowed, array('http', 'https'));
?>

この例だと、b, i, a, p, img, font, br が許可されるようになっています。
更に配列で属性等、細かなオプションが指定できます。a タグで見てみると、href属性に対して、minlen, maxlen というのが更にオプションで定義されており、最小/最大の長さを制限できます。
制限を超えると除去されます。minival, maxval によって文字列の長さではなく数値としての最小/最大値を定義できるようです。valuelessとあるのは、空の値を許可するかで、y/nによって指定します。

提供されるkses関数の第三引数に、arrayでhttpとhttpsを渡していますが、これは利用できるプロトコルの制限を行っています。ftp等を指定されると困るようなケースにおいて有用です。

実際にどのように変換されるか見てみましょう

入力

<a href="http://phpspot.org/" onclick="alert(document.cookie) title="phpspot">phpspot</a>
<script>
alert(document.cookie);
</script>
<p align="center" style="font-size:100em">hogehoge<img src="http://phpspot.org/blog/img/title.jpg"></p>

出力

<a href="http://phpspot.org/">phpspot</a>

alert(document.cookie);

<p align="center">hogehoge<img src="http://phpspot.org/blog/img/title.jpg"></p>

なんとも綺麗に変換されました。
WEBサイトを作っていると、一部タグを許可したいけどセキュリティが不安というようなケースはよくあることなので覚えてくとよいかもしれませんね。

関連の記事検索:PHP
スポンサード リンク

By.KJ : 2010年06月28日 10:06 livedoor Readerで購読 Twitterに投稿

間違いの指摘をしていただける方はメール、あるいはTwitter/FBでお願いします(クリック)