このエントリを読むとエスケープという処理が如何に理解されていないか、ということが見えてくる。
誤解1. エスケープによってサーバに帰ってきたときに結果が変化すると思いこむ
「テキスト」として表示される情報は表示された時点で役目を終えますが、<input>や<textarea>の情報はサーバに返ってくるものなので、変更せずに返された場合は可能な限り元の情報と同じとなるようなエスケープ処理を施したい。
サーバに帰ってくるデータは、ブラウザ (ユーザエージェント) がHTMLを解釈し、アンエスケープした後のデータである。例を出そう。
HTML: |
<form action="/some/where" method="get">
<input type="text" name="foo" value="ABC">
<input type="text" name="bar" value="ABC">
</form>
|
結果: |
GET
/some/where?foo=ABC&bar=ABC HTTP/1.1 |
HTML: |
<a href="/some/where?foo=ABC&bar=ABC">blah blah</a>
|
結果: |
GET
/some/where?foo=ABC&bar=ABC HTTP/1.1 |
HTMLエスケープはたかだか、出力したHTMLを解釈する時点において効果を発揮するに過ぎない。HTMLパーサはエスケープを入力時に正しくアンエスケープする (データ入力時のアンエスケープ行為)。ユーザエージェントが出力する際に、アンエスケープ後のデータを出力するメソッド (フォームの場合はURLエンコードパーセントエンコーディング) で正しくエスケープする。