PHP関数 mb_convert_kana() の罠

2009.07.03 Author: Jas

PHPマニュアルによると、mb_convert_kana() のオプションは以下のようになっています。

r「全角」英字を「半角」に変換します。
R「半角」英字を「全角」に変換します。
n「全角」数字を「半角」に変換します。
N「全角」英数字を「半角」に変換します。
a「全角」英数字を「半角」に変換します。
A「半角」英数字を「全角」に変換します ("a", "A" オプションに含まれる文字は、U+0022, U+0027, U+005C, U+007Eを除く U+0021 - U+007E の範囲です)。
(以下省略)


一見、オプションの'rn' = 'a'、'RN' = 'A'のように見えますが、実はそうではありません。

ポイントは'A'オプションの説明にカッコ書きで書かれている部分です。

("a", "A" オプションに含まれる文字は、U+0022, U+0027, U+005C, U+007Eを除く U+0021 - U+007E の範囲です)

'a'オプションと'A'オプションの変換対象になるのは、「英数字」だけではないのです。
U+0021 - U+007Eの範囲には、'!'や'#'、'&'などのASCII文字が含まれています。

そして、対象外となるのは以下の四つのみということです。
U+0022: " (ダブルクォート)
U+0027: ' (シングルクォート)
U+005C: / (バックスラッシュ)
U+007E: ~ (チルダ)

ここで、大問題になるのが変換対象の範囲に'<'や'>'、'&'が含まれていることです。

mb_convert_kana() を使用したことにより、意図しないタグが生成され、セキュリティホールにならないように細心の注意が必要です。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ