「サニタイズ言うな」の先駆け?

昔の投稿記事などを整理していたら、2001年に日経オープンシステム誌(この雑誌も今はないが)に投稿したWebアプリケーションセキュリティの寄稿が目に止まった。古い記事なので、「今だったらこうは書かないよなぁ」という部分もあるし、「ずいぶんと気負いこんで書いているな」という部分もあったが、その中に「サニタイズ言うな」と関連する内容が合ったので、引用として許される範囲で紹介したい。

「危険な文字の除去」は簡単だが推奨できない

 このクラッキングの回避策としてまず思い付くのは,「危険な文字を削除する」というアプローチである。SQLの場合に「危険な文字」となるのは前述のシングル・クオートであるから,この文字さえ削除してしまえば,SQL改ざんのクラッキングは不可能になる。任意の文字列からシングル・クオートを取り除くプログラムの例を図3に示した。

 一般にこの種のテクニックはインターネットでは広く利用されているが,筆者はこの種の方法は望ましくないと考えている。その理由は後述するとして,ではなぜ「危険な文字を除去する」という方法が広く行われているのであろうか。筆者は,Webアプリケーションが広まり始めたころにPerl言語によるCGI(CommonGatewayInterface)が主流だったからではないかと考えている。Perl言語を使えば,特定文字列の除去などは1行で書けるような,最も簡単な処理の一つである。図3にはシングル・クオート除去のPerl版も示したが,サブルーチンにするまでもないほど極めて簡単に記述できる。この手軽さゆえに,「危険な文字・文字列は除去してしまう」というやり方が広まったのではないだろうか。

 筆者が「危険な文字を除去」するアプローチが良くないと考える第1の理由は,まずユーザーの入力を勝手に改変して処理を継続している点である。無料掲示板なら文句も出ないかもしれないがビジネス・アプリケーションやECサイトにおいて,いくらセキュリティ上の危険があるからといって,ユーザーが入力した内容を勝手に改変してよい理由はない。したがって,不適切な文字が入力に混入していたら,処理を継続するのではなくエラーを表示して再入力を促すべきである。

 第2の理由は,シングル・クオートを除去するにせよ,エラーにするにせよ,その根拠が「処理上都合が悪いから」というプログラマの論理に基づいている点である。本来,入力として適切な文字かどうかは,ビジネス・ルールから決まるものであって,プログラマの都合で勝手に変えてよいものではない。

[日経オープンシステム2001年8月号P181から]

高木氏の「サニタイズ言うなキャンペーン」とは何か (takagi-hiromitsu.jp)が2005年末の投稿ですから、早いことは早いですわなww
さらに、Perl CGIに対する言及もしっかりあったりして(^^; ただ、Perl言語が悪いと言っているわけではないことは、先入観に(どんな先入観だ)にとらわれずにお読みいただければ分かっていただけるかと。

追記(2007/08/29)

サニタイズ言うな」宗家の高木浩光氏からはてなブックマークコメントを頂戴しました。

内容自体は昔からですよ。http://tinyurl.com/2cmhxp にせよ http://tinyurl.com/2dzmtq にせよ。それが、その後サニタイズという用語の広まりによって悪い方の発想が急速に広がっていったため、キャンペーンで食い止める必要が生じた

お忙しい中、丁寧なコメントを頂戴しありがとうございます(_ _)
「その後サニタイズという用語の広まりによって悪い方の発想が急速に広がっていった」ということですが、2001年の段階で「サニタイズ」という言葉はそれほど普及していなかったものの、サニタイズ的手法自体は、むしろセキュリティ対策の主流だったように記憶しています。私はそのような状況にイライラしていて、その気持ちが、「一般にこの種のテクニックはインターネットでは広く利用されているが,筆者はこの種の方法は望ましくないと考えている」だとか、「いくらセキュリティ上の危険があるからといって,ユーザーが入力した内容を勝手に改変してよい理由はない」、「プログラマの都合で勝手に変えてよいものではない」などの表現に現れています。
 私は露骨な表現を好まないために、上記のような控えめな表現(当時はこれでもかなりドキドキしながら書いたのですが)になったのですが、全然影響力はなかったですね。高木さんが大きな影響力を発揮された理由には「サニタイズ言うな」という卓抜な(日本語としてはこなれないためにかえって印象に残る)ネーミングと、ずばりとした表現もあるのでしょう。
このテーマについてはもう少し書きたいことがありますが、まずはお礼まで。ありがとうございました。