「サニタイズ」の方針を考える

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

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

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

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

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

結論として:

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

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

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

HTTP OriginヘッダはCSRF対策の切り札になるんですかね

RFC 6454 - The Web Origin ConceptでHTTP Originヘッダが提案されています。CSRF対策に使われることを意図したものです。

CSRF対策方式には、すでに「秘密情報(トークン)の埋め込み」「パスワード再入力」「Refererのチェック」があります(徳丸本より)。新たなHTTPヘッダを定義してまで、方式を増やす必要があるのでしょうか。

実際、Originヘッダのドラフトが公開された際には、Roy T. Fielding先生の名言「CSRF is not a security issue for the Web.」を含め、多数の指摘がありました。ietf-http-wg@w3.orgのアーカイブで読めるので、ご興味のある方には一読をお勧めします。

提案の背景をざっとお知りになりたい方には下記のPDFが参考になるでしょう。

提案者が描いているようなバラ色の未来は本当に来るのでしょうか。もし来るのであれば、僕にとってはありがたい話です。実装が面倒でRESTにもなじまないトークン方式を使う必要も、Refererを無効にする機器やソフトを気にする必要もなくなります。どうなんでしょうね。

記事検索
Twitter