SQLインジェクション攻撃で私が見たすべては、パラメータ化されたクエリ、特にストアドプロシージャのクエリが、このような攻撃から保護する唯一の方法であることを示唆しているようです。私が(暗黒時代に)働いていたとき、主に保守性が低いと見られていたため、ストアドプロシージャは貧弱なプラクティスと見なされていました。テスト可能性が低い。高度な結合; システムを1つのベンダーにロックしました。(この質問は他のいくつかの理由をカバーしています)。
私が働いていたとき、プロジェクトはそのような攻撃の可能性にほとんど気づいていませんでした。さまざまな種類の破損からデータベースを保護するために、さまざまなルールが採用されました。これらのルールは次のように要約できます。
- クライアント/アプリケーションは、データベーステーブルに直接アクセスできませんでした。
- すべてのテーブルへのすべてのアクセスはビューを介して行われました(ベーステーブルへのすべての更新はトリガーを介して行われました)。
- すべてのデータ項目にドメインが指定されていました。
- データ項目をNULL可能にすることは許可されませんでした-これは、DBAが時々歯を磨くという意味がありました。しかし、強制されました。
- ロールと権限が適切に設定されました-たとえば、ビューのみにデータを変更する権限を与える制限されたロール。
SQLインジェクション攻撃を防ぐために、このような(強制的な)ルールのセット(必ずしもこの特定のセットである必要はありませんが)は、パラメーター化されたクエリの適切な代替手段ですか?そうでない場合は、なぜですか?データベースは、データベース(のみ)固有の手段によって、このような攻撃から保護できますか?
編集
質問の強調は、受け取った最初の回答に照らして、わずかに変わりました。基本質問は変更されていません。
EDIT2
パラメータ化されたクエリに依存するアプローチは、システムに対する攻撃に対する防御の周辺ステップにすぎないようです。より根本的な防御が望ましいと思われ、特にインジェクション攻撃から防御する場合でも、そのようなクエリへの依存は不要であるか、それほど重要ではないようです。
私の質問に暗示されているアプローチは、データベースの「装甲」に基づいており、それが実行可能なオプションであるかどうかはわかりませんでした。さらなる研究は、そのようなアプローチがあることを示唆しています。このタイプのアプローチへのポインタを提供する以下のソースを見つけました。
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
これらのソースから取得した主な機能は次のとおりです。
- 広範なセキュリティデータディクショナリと組み合わせた広範なデータディクショナリ
- データディクショナリからのトリガー、クエリ、および制約の生成
- コードを最小化し、データを最大化する
これまでの回答は非常に有用であり、パラメータ化されたクエリを無視することから生じる困難を指摘していますが、最終的には元の質問に回答しません(太字で強調されています)。