必要なのはサニタイズではなくデコードとエンコード

最近ウェブで遊びだしたプログラマとしては、こっち方面のプログラミングでは何だかなぁという話が多い。


「サニタイズ言うなキャンペーン」私の解釈


この記事は、間違っているわけではないが、「サニタイズ」の問題に対する言及としては足りない。


まず、最初の問題として、ウェブアプリケーションに於ける入力と出力のアンバランスさがある。ウェブアプリケーションの入力は「文字列」で出力は「HTML」なのだ。この問題に対応するために、内部表現を「文字列」に統一し出力時に「HTML」エンコードする、という言及記事の考えは正しい。


しかし、内部表現を「文字列」に統一してしまうと、そのアプリケーションは「文字列」しか扱えなくなるのである。「文字列」以外を扱うアプリケーションでは問題が生じる。と云うより、記事の考え方では問題解決にならない。


正しくは、内部表現と外部データを明確に分けて考えなければならない。
入力データが常にエンコードされていると考えれば、デコードは必須なのだ。すべての入力データは、まず「数値」、「文字列」、「HTML型」などの内部表現にデコードされなければならない。そして、これらの内部表現は、出力の際には常に「HTML」にエンコードされなければならない。


言及記事では、入力データのデコードが抜けているのである。


サニタイズ」の問題点は、アプリケーション内部と外部の責任分界が曖昧で、入力データをデコードせずに内部表現の「文字列」として扱ってしまっていることなのだ。「デコード」「エンコード」という概念が無いから、「デコード」の代わりに「サニタイズ」と云う中途半端な概念が出来上がってしまったのであろう。
また、多くのウェブアプリケーションで使われている言語が「HTML型」に相当する内部表現を持たない*1ことが、混乱を引き起こしているとも思われる。

*1:ライブラリでカバーすれば良い事ではある。