名前付きパラメーターを使用していないSQL Serverのすべてのクエリを無効にしますか?
-
29-10-2019 - |
質問
名前付きパラメーターを使用していないすべてのクエリを単に拒否することにより、SQL注入のすべての脅威を完全に止めることができるようです。それを行うようにSQLサーバーを構成する方法はありますか?または、SQLパーサー全体を書くことなく各クエリを検査することにより、アプリケーションレベルでそれを実施する方法はありますか?ありがとう。
解決
これを行う方法はいくつかあります。 OMG Poniesには最良の答えがあります。データベースに対する直接SQLステートメントを許可しないでください。代わりに、ツールを活用してSQL Serverが提供できるセキュリティを活用します。
別の方法は、すべてのクエリが通過する必要がある追加層を追加することです。要するに、すべてのクエリ(SOAアーキテクチャ)を新しいアプリに渡し、SQL Serverに渡すクエリを評価します。私は、彼らのサイトが持っていたSQLインジェクションの問題に反応してこれを行う正確な1つの会社を見てきました。
もちろん、SQL注入は潜在的な問題の1つにすぎないため、これは物事を行う恐ろしい方法です。
SQL注入を超えて、サイト自体が割れたときに何が起こるかについての問題もあります。新しいページをWebサーバーに書き込むことができたら、必要なクエリを関連するデータベースサーバーに渡すのが簡単になります。これにより、導入できるコードレベルのものを簡単にバイパスできます。そして、それは攻撃者がただ書くことを可能にします select * from ...
また truncate table ...
ヘック、内部の人は、サイトの資格情報を使用してSQLサーバーに直接接続し、必要なクエリを実行する可能性があります。
ポイントは、SQL Serverに組み込まれたセキュリティを活用して直接テーブルアクセスを防ぐ場合、サーバーに接続しようとする人に利用できるすべてのアクションをストアドプロシージャで制御できることです。
他のヒント
- 関与するテーブルに対して選択/更新/挿入/削除を可能にする役割のために助成金を削除します
- ストアドプロシージャ/関数/などの役割について執行する
- 役割をデータベースに関連付けるユーザーを保護します
アクセスを許可する機能も備えていませんが、役割に関連するユーザーが(ユーザーごとに他の助成金がないと仮定して)停止しないようにします。 /存在するなど。
そして、どのようにそれをチェックしたいですか?クエリには、クエリに簡単に追加される一定の値がある場合があります。たとえば、私は多言語になるように準備されたデータベースを持っていますが、すべてのコードがそうではないので、私のクエリは次のようになります。
SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1
IDはパラメーターですが、言語IDはそうではありません。このクエリをブロックする必要がありますか?
名前付きパラメーターを使用しないクエリをブロックするように依頼します。それは簡単に実施できます。パラメーターを指定しないクエリをブロックするだけです。これをアプリケーションレイヤーで行うことができます。ただし、上記のクエリのようなクエリをブロックするのは難しいでしょう。1つの値はパラメーターであり、もう1つはパラメーターではありません。あなたはそれを検出するためにそのクエリを解析する必要があり、それも難しいでしょう。
SQL Serverには、これを行うための組み込み機能があるとは思いません。