HTMLエスケープを簡単にする独自のPHP関数

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

ウェブサイトのユーザー(訪問者)がフォーム入力した文字列を表示するなどの場合、HTMLエスケープの処理を行い、クロスサイトスクリプティングによる攻撃を回避しなければなりません。

HTMLエスケープを行わなければ、HTMLタグやJavaScript、VBScriptなどのコードが有効になってしまい、Cookieが盗まれたり、ページを改ざんされたり、ブラウザをクラッシュしたりなどの攻撃を受ける可能性が出てきます。
これらの攻撃のことを、クロスサイトスクリプティングと呼びます。


HTMLエスケープするべき文字は、「<」「>」「&」「"」「'」などです。
これらの文字は、HTMLやJavaScriptを書くタグとして特殊な意味を持っているからです。
それぞれ、HTMLエスケープにより、「&lt;」「&gt;」「&amp;」「&quot;」「&#039;」という文字列に変更されます。

PHPの場合、HTMLエスケープを行うための関数として、htmlentities()、htmlspecialchars() などの関数が用意されています。
ただし、それぞれ・・・

htmlentities(文字列, クオートスタイル, エンコーディング)
htmlspecialchars(文字列, クオートスタイル, エンコーディング)

というスタイルで書く必要があり、頻繁に使う関数だけに若干面倒くさい。
例えば・・・

$escape_str = htmlentities($str, ENT_QUOTES, 'UTF-8');

という具合です。


そこで、これらのエスケープ処理を簡単に行う関数を作っておくと便利で、コードも短く書けます。

/********* w_he()関数 **********
HTMLエスケープ。文字列の配列値も渡せる
@パラメータは以下の3つ
$str        エスケープする文字列
$strcode    文字コード。デフォルト値:UTF-8
$entq       クオートスタイル。デフォルト値:ENT_QUOTES
**********************************/
function w_he($str, $strcode='UTF-8', $entq=ENT_QUOTES){
    if (is_array($str)) {
        return array_map("w_he", $str);
    } else {
        return htmlentities($str, $entq, $strcode);
    }
}

ウェブサイトで使う文字エンコードを、引数$strcodeのデフォルト値として与えておくと楽です。
使うときは・・・

$escape_str = w_he($str);

だけの記述で済みます。
また、文字列が配列となっている場合、if条件文のis_array($str)がtrueとなりますので、それぞれの文字列の配列の要素が一つずつ、array_mapに渡されて、w_he関数が再帰的に実行されます。

よく書くコードに関しては、自分で関数定義しておくと、コーディングが若干楽になりますね。
ただ、自分定義の関数名をつけるときは、関数の名前が競合しないようにするために(将来的にも)、あまりに短い関数名は付けないほうが良いような気はしますが。

以下を参考にしてみました。

htmlspecialchars関数を簡単に扱えるようにする [Z]ZAPAブロ~グ2.0


日時: 2008年02月13日 01:15
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/102

この記事にトラックバックされる方は、参照先が分かるようにするために、「HTMLエスケープを簡単にする独自のPHP関数」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - ウェブライフハック