入力時に文字参照に変換するのがよろしくない理由
2007年9月2日(日曜日)
入力時に文字参照に変換するのがよろしくない理由
「Twitterのクロスサイト・スクリプティング(XSS)対策は変だ (www.tokumaru.org)」。文字参照に変換した状態で DB に格納しているというのは、けっこう良くある話だろうと思います。この手のエスケープしすぎによる化けは、twitter に限らず、よく見かけますので……。
※HTML のエスケープに限らず、入力欄に \ を入れて検索すると \\ に化けて、検索ボタンを押すたびに \ が増殖していくという面白いシステムも良くありますね。
一昔前のフリーの掲示板 CGI などでは、フォームの値を読み取るところで < → < " → " のように文字参照に変換してしまうのが一般的でした。この手のアプリケーションは、
- 絶対に HTML にしかデータを出力しない
- フォームからの入力以外のデータを処理しない
- 作者が一人で開発しているので、出力時の処理も把握している
という条件を満たしているので、そのような処理をしてもあまり問題にならないのだと思います。これは小規模なフリー CGI だからこそ成立していた作法です。規模が大きくなってくると、以下のような問題が顕在化してきます。
- HTML の #PCDATA や RCDATA 以外のところにデータを出力する場合、面倒なことになる (たとえば電子メールやスクリプトに出力したいとき、わざわざ文字参照を展開する必要がある)
- フォーム入力以外のデータを扱うときには、別途処理が必要になる
- 出力時の処理がエスケープされていないデータを前提としている場合、多重にエスケープが行われて出力が化ける
- 文字数を数えるような処理が必要になると面倒なことになる
- 特定の文字数文字列をカットする処理をしたとき、文字参照の途中で切れてしまうことがある
どれも頑張れば対応できるのですが、頑張らないで出力時に考えた方が良いのではないかと。
- 「入力時に文字参照に変換するのがよろしくない理由」へのコメント (3件)
- 前(古い): マンガ買った
- 次(新しい): サーバのバージョン表示