MyTextSanitizerのhtmlSpecialChars考 (2)
さて、前回XOOPSのhtmlSpecialCharsにおいて
変換前 | 変換後 | 変換前 | 変換後 | |
& | & | " | " | |
< | < | | &nbsp; | |
> | > | α | α | |
' | ' | あ | あ |
という変換ルールが、フォームの入力域にも、通常の出力にも一様に適用されるということが、場合によって混乱を巻き起こすという事を書いたのですが、実際にどのように変更したらよいのかを検討してみたいと思います。
そもそも、今回のケースではHTMLの入力を許さない事が前提ですから、入力したテキストがそのまま出力される事が本来だと思います。しかしながら、最終的な出力でHTMLで許されない文字は変換をしないといけないですし、さらに脆弱性を産まないための補正があわせて行われるべきです。
いずれにせよ、フォームでの編集時には入力した時と同じ文字列が再現される事が望ましいです。
但し、HTMLは使えないにせよ、HTMLのエンティティ文字を使って、特殊記号などを表現したいという要求は高いと思います。小生も趣味のからみから、ドイツ語などをWEBに公開する事があるのですが、「Müchen」と表現したい場合に、日本語の環境では、「Müchen」等と記述する以外には出来ません。
この場合に「ü」を表示させたい目的で、「ü」と入力フォームに記述した場合、先ほどの前提では、HTMLには、「&uuml;」と出力されてしまい、結果として「¨」と表示されてしまいます。これでは結局ドイツ語はかけない事になります。
この様な用途を考えると、前回に書いたXOOPSの変換ルールの様に一旦htmlspecialchars()にて、「&uml;」に変換されたものを「¨」に戻してくれる事は、表示においては妥当な事だと言えるでしょう。しかしながら編集時にも同じルールでフォームのtextboxに出力されるので、textbox内にも直接「ü」が表示されてしまい、このまま投稿すると、こんどは文字化けの原因になる可能性が出て来ます。
エンティティー文字が活躍してくれる別の場面としては、海外のサイトに何らかの目的にて日本語を入力する場合があります。英語環境のXOOPSでも入力フォームに直接日本語文字列を入力すれば、そのまま日本語を出力してくれます。この場合は、実は入力した日本語文字列がそのままの文字コードにてDBに格納されるのではなく、POST時点で数値エンティティ文字に変換され、この数値エンティティ文字がDBに格納される事となります。
たとえば、英語環境のXOOPSに「あ」を入力すると、これが「あ」という数値エンティティ文字にブラウザ側で変換されてリクエストされ。これもXOOPSの変換ルールであれば、「あ」のままで、HTML出力されるので、正常に「あ」と読めるわけです。
この場合には、入力フォームのtextboxにも同じルールが適用された結果として「あ」と表示される事が非常に自然に見えるわけです。
この様な事を考えると、入力文字列が、
1.「ü」の様な文字列からなるエンティティ文字(文字実体参照)の場合は、
・表示時には、HTMLに、「ü」 と出力する。(「üと表示される)
・編集時には、HTMLに、「&uuml;」 と出力する。(「ü」と表示される)
2.「あ」の様な数値エンティティ文字(数値文字参照)の場合は、
・表示時・編集時ともに、HTMLに、「あ」と出力する。(「あ」と表示される)
・但し、数値エンティティ文字といっても、カレントのcharsetとのマッピングとの
関連からすると、すべてをこの様にするかどうかは疑問です。
・また、Win上のIE、FireFox、Operaで試した限りでは、この数値エンティティ文字
変換はすべて10進数変換でしたので、「あ」の様な16進数エンティティ
文字はルール1で良いと思います。
という変換ルールを採用するのが自然なような気がします。
この変換ルールについては、「&」と「 」を除いては、表示に関しては現在のXOOPSと互換性を持っていますし、再編集にもかなり強いルールとなります。
「&」に関してはHTMLのスペックを考えた場合には、やはり「&」と出力すべきだと考えますが、「 」に関してどうするかは、従来との互換性を含めて考慮しないといけないですね。
その他に考慮すべき点としては、
1.XOOPSのBBCodeにおける[code]中では、この様なエンティティー文字変換は
行わない事を前提とした方が便利だと思える。
但し、自動的に変換される数値エンティティ文字をどうするかは??
2.実は、XOOPSでフォームのtextareaを表示するにおいて、処理方法によって
結果が異なる。
a) 生値をMyTextSanitizerクラスの、htmlSpecialChars()または、
makeTareaData4Edit()を使用してサニタイズする場合。
b) XoopsObject内の値を getVar('id', 'e') のメソッドでサニタイズする場合。
a)に関しては、今まで書いてきたhtmlSpecialChars()を呼び出しているのですが、
getVarではhtmlspecialchars()関数をそのまま使用しています。
このあたりを総合的に考えた対応策については、また次回!
コメント
この投稿には、まだコメントが付いていません
コメントの投稿
ごめんなさい、現在コメントを付けることは出来ません