徳丸浩の日記: 処理開始後の例外処理では「サニタイズ」が有効な場合もある」を読んで、以前、奥さんに同様のご指摘をいただいたことを思い出した。

そのときは考えを深められなかったので、あらためて考えてみたい。

まず、徳丸さんが例に挙げられている「異常なデータを含むツイート」については、そもそもそのようなツイートを許さないようバリデーションすれば済む話といえる。それでも、保険的に「サニタイズ」したいケースはあるだろうし、しておいて困ることはないだろう。

実は、もっと積極的にサニタイズすべき場合がある。ブログのサイドバーに外部サイトのフィードを表示したり、Amazonの売れ筋ランキングを表示したりするケースだ。出どころが外部サイトである場合、いつ異常なデータを含むようになるか分からない。そのたびにブログがサービス不能になってしまってはいけない。

さらに考えると、サニタイズのタイミングはHTTPレスポンスの構築時が適切とはかぎらないだろう。外部サイトのデータを自アプリケーションのデータベースに保存しなければならない場合、バリデーションで保存をやめるより、サニタイズしてでも保存したほうがよいこともありうる。

結論として:

  • 自アプリケーションへのHTTPリクエストは即座にバリデーション
  • 外部サイトのデータは取得直後にサニタイズ
  • 保険をかけておきたければHTTPレスポンス構築時にサニタイズ

という方針が分かりやすいのではないだろうか。

追記(2012-04-03)
徳丸さんが補足記事「徳丸浩の日記: 悪いサニタイズ、良い(?)サニタイズ、そして例外処理」を書かれた。「サニタイズ」という表現を用いるべきでないという結論であり、異論はない。
私が「サニタイズ」で念頭に置いていたのは、徳丸さんが「許容例2:表示できない文字を扱う場合」で挙げている「表示できない文字を代替文字に置き換える処理」のことだった。これは何と呼べばよいのだろうか。