エスケープだけしてれば、セキュリティ対策が万全になる訳ではないですよ

本題

「サニタイズ言うなキャンペーン」私の解釈
読みました。分かりやすくとてもよい記事だと思いますが、ホワイトリスト型のアプローチが補助的な対策であるとも読み取れてしまうこともありそうなため、エスケープだけしておけば大丈夫という誤った認識を持ってしまう開発者さんが増えてしまいそうなのが心配です。ということで、いちお書いておきます。
SQL特殊文字エスケープすることで対策可能なセキュリティの問題は、特殊文字が混在することにより構文が破壊されるといった限定された状況だけです。
例としては、SQLインジェクションの解説でよく取り上げられる

select password from usertable where id = '入力値'
入力値に ' or '1' = '1 が与えられると・・・

といった攻撃は防ぐことは出来ますが、

select password from usertable where id = 入力値 (idが数値型)
入力値に 1 or 1 = 1 が与えられると・・・

といった攻撃を防ぐことは出来ません。このケースでは、前もって入力値が数値型であることを確認しておかなければなりません。データベース層のロジックは数値型しか受け付けない仕様を持つべきで、数値型であることの確認(と数値型への型変換)はアプリケーション層が担うべき責務となります。アプリケーション層では、数値型の入力値しか受け付けないというホワイトリスト型のアプローチが必要となります。
他に特殊文字エスケープだけでは足りないケースとしては検索系のシステムでは一般的な

select * from usertable order by 動的パラメータ
動的パラメータに入力値をそのまま使用していると・・・

といった構文のSQLがあげられます。このケースでは、Javeにおける PreparedStatement + setString() といったパラメータバインドの仕組みでも対応を完結することが出来ません*1ので、アプリケーション層における入力値チェック(及び入力値の変換)というアプローチが必要となります。
ライブラリなどの下位層で全ての問題が解決出来ることが理想ですが、残念ながら現状はそうではありません。それぞれの層における責務と出来ること出来ないことを正しく認識し、対策を行う必要があります。

ASP.NETのおかしな仕様

HTMLでエスケープしなければならない文字を(デフォルトでは) 入力の段階で弾いてしまうASP.NETは、そもそもその発想からして間違っている、と私は思う

この話は、http://vsug.jp/tabid/63/forumid/56/postid/789/view/topic/Default.aspx において私も議論しました。やっぱりおかしいですよね^-^;

*1:出来る場合は教えて下さい