>kmaebashiさんが『「サニタイズ言うなキャンペーン」について、私の解釈』や、
>著書でも述べられている、「SQLやHTML等で特別な意味を持つ文字列のエスケープは、
>入力時ではなくそれが外部に出力される直前に行うべき」という主張は納得できる
>ものだと私も思います。
>ただ、以下リンク先のページを見ると、CWE-20等の国際的なセキュリティ標準でも
>入力時のチェックを奨励しているように思えまして、ちょっと混乱しています。
>
https://gihyo.jp/dev/serial/01/php-security/0045
>「ユーザーからの入力はどんな文字列でも扱えるべきだが、システム内の各階層では、
>メソッドの引数チェックなりをしっかりやるように」との意味合いなのでしょうか?
まず、「入力時のサニタイズ」と「入力時のバリデーション」は違う話ですよね。
入力時にサニタイズ(無害化)するということは、無害化したその入力を後ろに
流してしまうわけです。実際、当時のPHPのmagic quoteはそんな仕組みでした。
これはどう考えてもおかしいわけで、今はPHPのmagic quoteは廃止されましたし、
リンク先の記事を書いている大垣さんも、「入力時のサニタイズ」は擁護していないと
思います。
「入力時のバリデーション」は、変な入力は入力の時点でエラーにして後ろに流さない
わけですが、これは別段セキュリティ関係なく、ユーザの入力ミスに備えてやるべき
ことですし、その要件はアプリケーションの仕様に依存します。たとえばこの掲示板の
本文は、シングルクォートだろうがHTMLタグだろうが通さなければいけないでしょう。
もちろん、電話番号欄にシングルクォートとか入力されたらエラーにすればよいですし、
そうすることが結果的にセキュリティに資することもあると思います。
入力時バリデーションは、
・そもそも要件としてバリデーションできないケースが(かなり)ある。
・入力から、DBとか、再度画面に表示されるところまでには、プログラム的に
長い経路があり、「セキュリティのために」狙ってバリデーションするのは
実際には困難。
という問題があります。そこで、入力時バリデーションはセキュリティ対策としては
「あてにできる」ものではない、と私は思います。
徳丸浩さんの記事:
もう入力値検証はセキュリティ対策として *あてにしない* ようにしよう
https://tumblr.tokumaru.org/post/55393403591/%E3%82%82%E3%81%86%E5%85%A5%E5%8A%9B%E5%80%A4%E6%A4%9C%E8%A8%BC%E3%81%AF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%81%A8%E3%81%97%E3%81%A6-%E3%81%82%E3%81%A6%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84-%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%82%88%E3%81%86
半面、入力バリデーション(と静的な型付け)で実際の攻撃を防げるケースもかなり
あるとも言われてはいて、たとえばOWASPの
Application Security Verification Standard 4.0には以下の記述があります。
https://owasp.org/www-pdf-archive/OWASP_Application_Security_Verification_Standard_4.0-en.pdf
> Properly implemented input validation controls, using positive whitelisting
> and strong data typing, can eliminate more than 90% of all injection attacks.
> Length and range checks can reduce this further.
ホワイトリストと静的型付けによる適切な入力バリデーションでインジェクション攻撃の
90%以上が防げるとあります。
大垣さんと徳丸さんとのこの手の議論は長くて、嫌気がさすほどですが(最終的に、
徳丸さんの方が、(おそらくは呆れ果てて)議論を放棄している)、
https://ockeghem.hatenablog.jp/entry/20111226/p1
https://tumblr.tokumaru.org/post/55587596019/%E5%8B%9D%E6%89%8B%E3%81%AB%E8%A7%A3%E8%AA%AC%E5%A4%A7%E5%9E%A3%E6%B5%81%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%85%A5%E9%96%80
入力時バリデーションが結果的にセキュリティ対策になることは徳丸さんは
一切否定していないので、どうもこの「議論」は食い違っているように私には見えます。
そもそも徳丸さんは、OWASP Japanアドバイザリーボードという立場の方なので、
OWASP含め、「国際的なセキュリティ標準」が何を言っているのか知らないわけはないですし。