いまさらながら「サニタイズ言うな」が理解できた

当時も読んでいたけど、いまさらながらに理解したような気がする。

自分なりにまとめると「あるフォーマットAの下で、プログラムの外から入力された文字列strを使うときには、str中にAにおける特殊文字が原因で予想外の働きをする可能性がある。そこで、Aの下でstrを使うときには、str内に登場するAにおける特殊文字をすべて適切にエスケープしてから使うべし。」という教え。strをHTML中で使うならば使用の直前にHTMLの特殊文字をエスケープし、SQL中で使うならば使用の直前にSQL特殊文字をエスケープし、URI中で使うならば使用の直前にURI特殊文字をエスケープする。

私のように各フォーマットの仕様にうといプログラマーは、既にどなたかが作り、一般的に使われているライブラリーを用いて、それぞれのフォーマットでエスケープするべし。Railsの場合は、

  • HTML中でstrを文字列として使う→ html_escape(str), <%=h str -%>
  • SQL中でstrを文字列として使う → プレースフォルダーを使う User.find(:conditions => ["str = ?", str])
  • YAML中にstrを格納する → ya2yamlを使う(内部でyaml_escapeという関数を用意し、エスケープを行っているみたい)
  • URI中でstrを文字列として使う → URI.escape, URI.encode

以上、自分のまとめとして。