htmlspecialchars()関数の第3引数(文字エンコード)について

■結論

本書では、htmlspecialchars()関数の第3引数(文字エンコード)を指定していませんが、今後は、第3引数(文字エンコード)を常に指定することを推奨します。

本書では、以下のような第2引数までしか指定していないコードが記載されていますが、

htmlspecialchars($string, ENT_QUOTES)

上記は、使用する文字エンコードがUTF-8の場合は、以下のようになります。

htmlspecialchars($string, ENT_QUOTES, 'UTF-8')

■解説

htmlspecialchars() の第3引数のデフォルト値は「ISO-8859-1」であり、本来、UTF-8で統一しているコードの場合、第3引数でUTF-8を指定するべきでした。

しかしながら、以前のPHPでは、第3引数を指定するメリットが少なく(例えば、htmlspecialcharsと不正な文字の話)、実務上も指定を省略している場合が多々ありました。そのため、本書では第3引数は省略されたコーディングとなっています。

しかし、その後、htmlspecialchars()での文字エンコードのチェックが強化されており(参考、htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか)、第3引数を指定することは、不正な文字エンコードによる攻撃を防ぐセキュリティ対策として意味があるように変化しました。

ただし、本書では文字エンコードのチェックは、入力時点で行うことを原則しており([レシピ 230]参照)、必ずしも出力時のチェックであるhtmlspecialchars()でのチェックは必要ないのではないかという疑問をお持ちになるかもしれません。

これについては、セキュリティ対策の基本 [レシピ 229] の3. 多重防御の観点から、出力時点であっても、すでに用意されている機能であり積極的に使うべきであると考えることができます。

さらに、UTF-8の5バイト、6バイトの形式の場合、mbstring()ではチェックしないが、htmlspecialchars()ではチェックすることがわかっています(参考、文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定 )。

このような状況を鑑み、htmlspecialchars()関数の第3引数を指定することを推奨するという追加情報を公表いたします。

kenji posted at 2010-10-4 Category: 追加情報

Trackback URL

One Response Leave a comment

  1. […] This post was mentioned on Twitter by Kenji, 『PHP逆引きレシピ』. 『PHP逆引きレシピ』 said: 『PHP逆引きレシピ』追加情報 htmlspecialchars()関数の第3引数(文字エンコード)について http://php-recipe.com/?p=377 […]