はじめに

PHPを使って入力フォームを作っている際に、出会ったhtmlspecialchars関数。セキュリティ面でとても重要で今後も必須になると思うので、まとめておきます。

Contents

htmlspecialchars関数とは?

まず、htmlspecialchars関数とは何をする関数なのかを見ていきましょう。「PHP関数リファレンス」によると「特殊文字を HTML エンティティに変換する」とのことです。
つまり、「&」や「<」などが、「&amp;」や「&lt;」などに変換されるということです。

使い方は、以下の通りです。

htmlspecialchars("文字列", フラグ, "文字コード")

フラグは様々ありますが、それはリファレンスを参照するとして、良く使うフラグを一つ挙げると、「ENT_QUOTES」というものです。
これは、シングルクオートもダブルクオートも変換するというフラグです。

さて、ではなぜこのような関数が必要なのか?
それは、次のXSSと関係しています。

XSSについて

XSSは「クロスサイトスクリプティング」の略です。これは、PHPのような動的なWebページを生成するものにおいて、悪意のあるコードを埋め込む攻撃や、それを許す脆弱性を指します。

例えば、入力フォームに名前を入力すると、その名前が出力されるようなスクリプトを書いていたとしましょう。

<p>こんにちは!<?php echo $_POST['my_name'] ?>さん</p>
//$_POST['my_name']にはフォームで入力された名前が入っている

さて、それではこのフォームに次のようなスクリプトを入力したとしましょう。

<script>alert('XSS攻撃!');</script>

こうすると、PHPによって、上のスクリプトがHTMLに混入され、予期せぬアラートが出てしまいます。
これは単純な例ですが、もっと複雑なコードを組み込まれると大変な被害に遭うこともあります。

XSS対策としてのhtmlspecialchars関数

そこで、有効になるのが、htmlspecialchars関数です。
先程のコードを

<p>こんにちは!<?php echo htmlspecialchars($_POST['my_name'], ENT_QUOTES, 'UTF-8') ?>さん</p>

という風にすると、特殊文字が変換され、悪意のあるコードが入力されても、HTML上では機能しなくなるのです。
動的に出力される部分には必ずこの処理を施しましょう。関数にしちゃって呼びだすのが楽なようですね。

参考サイト