「徳丸浩の日記: 処理開始後の例外処理では「サニタイズ」が有効な場合もある」を読んで、以前、奥さんに同様のご指摘をいただいたことを思い出した。
そのときは考えを深められなかったので、あらためて考えてみたい。
まず、徳丸さんが例に挙げられている「異常なデータを含むツイート」については、そもそもそのようなツイートを許さないようバリデーションすれば済む話といえる。それでも、保険的に「サニタイズ」したいケースはあるだろうし、しておいて困ることはないだろう。
実は、もっと積極的にサニタイズすべき場合がある。ブログのサイドバーに外部サイトのフィードを表示したり、Amazonの売れ筋ランキングを表示したりするケースだ。出どころが外部サイトである場合、いつ異常なデータを含むようになるか分からない。そのたびにブログがサービス不能になってしまってはいけない。
さらに考えると、サニタイズのタイミングはHTTPレスポンスの構築時が適切とはかぎらないだろう。外部サイトのデータを自アプリケーションのデータベースに保存しなければならない場合、バリデーションで保存をやめるより、サニタイズしてでも保存したほうがよいこともありうる。
結論として:
- 自アプリケーションへのHTTPリクエストは即座にバリデーション
- 外部サイトのデータは取得直後にサニタイズ
- 保険をかけておきたければHTTPレスポンス構築時にサニタイズ
という方針が分かりやすいのではないだろうか。
- 追記(2012-04-03)
- 徳丸さんが補足記事「徳丸浩の日記: 悪いサニタイズ、良い(?)サニタイズ、そして例外処理」を書かれた。「サニタイズ」という表現を用いるべきでないという結論であり、異論はない。
- 私が「サニタイズ」で念頭に置いていたのは、徳丸さんが「許容例2:表示できない文字を扱う場合」で挙げている「表示できない文字を代替文字に置き換える処理」のことだった。これは何と呼べばよいのだろうか。