サニタイズ言うなキャンペーンが理解できない人の考え方

 
 単純。「異常な(= 想定していない)値の処理」だから異常系だと考える。以上終了。
 
 
 つまりだ。たかぎせんせいは「正常系」の処理として、入力された値を「出力するときに相手の都合に合わせて適切なフォーマットで出力しませう」と言っている。これはもちろん正常系の動作で、インターフェイスに合わせて出力するのが当然だ。
 対して「サニタイズ脳」の俺みたいな人は、「異常な値に対応するのは異常系である」と認識するわけだ。そこからもうグダグダだけどな。スクリプトの目的が違っちゃってる。
 つまり、たとえばインターフェイスから範囲外の値が入力されたとき、「値が大きすぎます」とか「値が小さすぎます」といったエラー処理を行う。これは異常系の処理。この延長線上で、「HTMLのメタキャラクタはアウト」「SQLのメタキャラクタはアウト」 → 「要するに入れちゃダメな値が入ってきたわけだ」 → 「じゃあ異常系で」と考えてしまう。
 ところがスクリプトは「入力値をもとに適切な結果を出力する」のが使命なわけだ。相手がブラウザだろうがデータベースだろうが関係ない。入力を受けて出力する。応答の入力を受けて、また出力する。異常値が入力されたら、出力先が困らないように出力してやればよい。それは正常な処理だ。出力できるんだから。
 
 あと、処理を一箇所に固めたいというニーズを間違った実装で実現してしまう。俺みたいなサニタイズ脳の持ち主は、とりあえずまとめてエスケープ処理をしてしまう。ハッカージャパンのサンプルコードを見ると良くわかるだろうけど、Perl なサンプルでは最初に正規表現で置き換え処理をまとめてやっている。なぜか。説明すんのが厳しいから。それやりだすとページ足りません。
 っつうかエラー処理ひとつまともに入れてないけどな。
 
 閑話休題
 
 本来、「処理をまとめておきたい」というなら、モジュールにしていつでも呼び出せるようにしておけばよい。本当ならそうやっておいて、HTML の一部として出力するなら「HTML向けエスケープ処理関数」とか呼べばいい。SQLならSQL向けに、CSVならCSV向けに呼べばいい。
 でもさっき書いたような「異常系でしょ?」な人は、入力を受け取った直後にやりたくなる。だって異常値なんだから入力の直後にチェックするのが普通ジャン、となる。もっと突き抜ければ、「ブラウザでJavaScript使って異常値を入力できないようにしてますっ!」となったりもする。
 ということで、立派なサニタイズ脳の持ち主たる俺様の言い分はこうなる。
 
 「入力値に危険な文字が含まれていた場合に対応できるよう、適切にサニタイズする」
 
 異常系で処理していた人が正常系の処理で同じ目的を果たそうとしたら、それなりになんていうかそれまでの自分を否定したような気分になるのだろう。サニタイズ脳の持ち主である俺様は否定されても仕方のないような過去しか持ち合わせていないのでそのあたり気楽なもんだが、異常系の人にとってはツラいのかもしれない。
 しかもたかぎせんせいは煽りオーラの放出濃度が高いし(笑
 反発したくなるんだろう。
 
 
 ということで、俺のようなサニタイズ脳の人が減らない理由をいくつか考えてみたわけだ。
 

  • 「異常な入力」を「異常系」で処理したい
  • 「処理をひとまとめにする」ときに間違ったやりかたをしている
  • それでもそれなりに動いてきた
  • いまさら変えたくない
  • ひろみちゅがなんかムカツク
  • サニタイズで何が悪い

 
 つうことでサニタイズサニタイズ言う人は当分減らないと思う。半端なプログラマ上がりとかなんとなくセキュリティかじってるだけの俺様みたいな奴は明らかにサニタイズ脳。っつうか俺もキャンペーン前はサニタイズ脳の感染拡散源だったし。増やしてた。ごめん。
 
 
 
 
 ('A`)ウボア