名前付きパラメーターを使用しないすべてのクエリを単に拒否するだけで、SQL インジェクションのすべての脅威を完全に阻止できるようです。それを行うためにSqlサーバーを構成する方法はありますか? または、SQL パーサー全体を作成せずに各クエリを検査することにより、アプリケーション レベルでそれを強制する方法はありますか? ありがとう。
3 に答える
- 関係するテーブルに対してSELECT/UPDATE / INSERT / DELETEを実行できるように、ロールの付与を削除します
- ストアドプロシージャ/関数などの役割にEXECUTEを付与します
- 保護するデータベースユーザーにロールを関連付けます
アクセスを許可する機能もあるアカウントは停止しませんが、ロールに関連付けられているユーザー(ユーザーごとに他の許可がないと仮定)は、ストアドプロシージャ/関数の外部でクエリを実行できなくなります。 /etcが存在します。
これを行うにはいくつかの方法しかありません。OMG Ponies が最良の答えを持っています。データベースに対して直接 SQL ステートメントを許可しないでください。代わりに、SQL サーバーが提供できるツールとセキュリティを活用してください。
別の方法は、すべてのクエリが通過する必要がある追加の層を追加することです。つまり、すべてのクエリ (SOA アーキテクチャ) を新しいアプリに渡し、SQL サーバーに渡すクエリを評価します。サイトで発生した SQL インジェクションの問題に対応して、これを行っている会社を 1 社だけ見たことがあります。
もちろん、SQL インジェクションは潜在的な問題の 1 つにすぎないため、これは恐ろしい方法です。
SQL インジェクション以外にも、サイト自体がクラックされたときに何が起こるかという問題もあります。新しいページを Web サーバーに書き込むことができるようになると、必要なクエリを関連付けられたデータベース サーバーに渡すのは簡単になります。これにより、配置できるコードレベルのものを簡単にバイパスできます。また、攻撃者は書き込みselect * from ...
やtruncate table ...
内部の人がサイトの資格情報を使用して SQL サーバーに直接接続し、必要なクエリを実行できる可能性があります。
要点は、SQL サーバーに組み込まれているセキュリティを利用してテーブルへの直接アクセスを防止すると、ストアド プロシージャを介して、サーバーに接続しようとするすべてのユーザーが利用できるすべてのアクションを制御できることです。
そして、それをどのようにチェックしたいですか?クエリには、クエリに簡単に追加できる定数値が含まれる場合があります。たとえば、多言語に対応できるように準備されたデータベースがありますが、すべてのコードがそうであるとは限らないため、クエリは次のようになります。
SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1
IDはパラメーターですが、言語IDはパラメーターではありません。このクエリをブロックする必要がありますか?
名前付きパラメーターを使用しないクエリをブロックするように要求します。それは簡単に実施できます。パラメータを指定しないクエリをブロックするだけです。これは、アプリケーション層で実行できます。ただし、一方の値がパラメータで、もう一方の値がパラメータではない上記のようなクエリをブロックするのは困難です。あなたはそれを検出するためにそのクエリを解析する必要があるでしょう、そしてそれも難しいでしょう。
SQLServerにはこれを行うための機能が組み込まれているとは思いません。