PHPプロ!TIPS+

HTMLエスケープ方法を見直そう htmlspecialcharsとhtmlentities

HTMLをエスケープする関数にhtmlspecialcharshtmlentitiesがあります。この2つの関数の違いをご存知でしょうか。また、意図通りにエスケープ処理を実行する為には第2、第3引数を指定する必要があります。

これらの関数の違いは変換する文字数です。htmlspecialcharsはデフォルトで4つの文字(<、>、&、")をHTML の表現形式に変換します。対して、htmlentitiesはデフォルトで先の4つを含む100個の文字を変換します。より厳密にエスケープしたいなら、 htmlentitiesを使う必要があります。

これらの文字変換テーブルはget_html_translation_table関数で確認して下さい。

しかし、オプションで用意されている引数を指定せずに、これらの関数を使うことは危険です。シングルクォーテーション(')をエスケープしないからです。脆弱性の例として、HTMLタグの属性値をシングルクォーテーションで囲っている場合が考えられます。

<input type='text' name='sample'
 value='<?php echo htmlentities($_POST['sample'])?>' />

このような場合、XSS脆弱性が存在し

$_POST['sample'] = "100' onMouseover='alert(\"XSS\")";

とすることでjavascriptが実行されたり、不正なタグが表示されてしまいます。 これを防ぐにはシングルクォーテーションを変換することが必要ですが、第2引 数にENT_QUOTESを指定することで可能になります。また、第3引数で変換に使用 される文字セットを指定して下さい。つまり、意図通りに出力したいなら

htmlentities($str, ENT_QUOTES, mb_internal_encoding())

とする必要があります。ただし、サポートされている文字セットは http://www.phppro.jp/phpmanual/php/function.htmlentities.html の表2に載っているものだけであり、eucJP-win等の場合はEUC-JPで指定する必要があります。

皆さんのコードをもう一度確認してみて下さい。もしかしたら思わぬ所に脆弱性が見つかるかもしれません。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)