2011-02-05 14 views
0

名前付きパラメータを使用しないすべてのクエリを単に拒否するだけで、SQLインジェクションのすべての脅威を一度にすべて停止することができます。それを行うためにSQL Serverを構成する方法は?または、SQLパーサ全体を記述せずに各クエリを検査することで、アプリケーションレベルでそれを強制する方法はありますか?ありがとう。名前付きパラメータを使用しないSQL Serverのすべてのクエリを無効にしますか?

+0

これはどのようにしてすべてのSQLインジェクションを停止しますか? – DaveShaw

+0

明らかです。パラメータにSQLを挿入することはできません。 – GolezTrol

答えて

2

これを行うには、いくつかの方法があります。 OMG Poniesには最良の答えがあります。データベースに対して直接SQL文を許可せず、代わりにSQL Serverが提供できるツールとセキュリティを活用してください。

別の方法として、すべてのクエリが通過する必要がある追加の層を追加することができます。要するに、すべてのクエリ(SOAアーキテクチャ)をSQL Serverに渡すためのクエリを評価する新しいアプリケーションに渡します。私は、サイトが持っていたSQLインジェクションの問題に反応して、まさにある企業がこれを行うのを見てきました。

もちろん、SQLインジェクションは潜在的な問題の1つに過ぎないため、これは恐ろしいことです。

SQLインジェクション以外にも、サイト自体にクラックが発生した場合の問題があります。新しいページをWebサーバーに書き込むことができれば、関連するデータベースサーバーに任意のクエリを渡すことは簡単になります。これは、あなたが配置できるコードレベルのものを簡単にバイパスします。攻撃者はselect * from ...またはtruncate table ... Heckと書くことができます。内部の人は、サイトの資格情報を使用してSQL Serverに直接接続し、必要なクエリを実行するだけです。

重要なのは、SQL Serverに組み込まれたセキュリティを活用してダイレクト・テーブル・アクセスを防止すると、ストアド・プロシージャを介してサーバーに接続しようとするすべての人が利用できるあらゆるアクションを制御できるということです。

+0

MVCパターンは、基本的には?種別: –

+0

dbアクセス部分だけがファイアウォールの背後に隠れた別個のアプリケーションでなければならず、ホワイトリストのマシン(IISサーバー)によって特定の方法でしかアクセスできません。より簡単に、より良い方法が存在するときには、多大なトラブルが発生します。 – NotMe

4
  1. (S)テーブルに対してDELETE// UPDATE/INSERTを選択することができるようにする役割のために許可を削除
  2. グラントは、ストアドプロシージャ/機能のための役割に/実行など
  3. アソシエイト関係あなたが保護したいデータベースユーザへのロール

アクセスを許可する権限を持つアカウントは停止しませんが、ロールに関連付けられているユーザは停止します(ユーザーごとに)ストアドプロシージャ/関数/ etcの外でクエリを実行することができなくなります。exi st。

+0

+1000。これは最善の方法です。なぜそれをwikiとしてマークしましたか? – NotMe

+0

しかし、それはストアドプロシージャにすべてのクエリを置くことを余儀なくさせるでしょう。パラメータのないクエリをブロックしているわけではなく、すべてのクエリをブロックしているだけです。 :) – GolezTrol

+0

ストアドプロシージャは、コードの可読性を低下させ、コードプッシュの複雑さなどを導入します。これについては、別のSOの質問があります。 Sqlサーバーが名前付きパラメーターなしでWHERE節を検出し、それらを拒否するのは些細なことです。これを行う方法がないことは奇妙です。 – nganju

0

どのようにチェックしたいですか?クエリには、クエリに簡単に追加できるような一定の値が含まれることがあります。

SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1 

IDがパラメータであるが、言語IDではありません:たとえば、私はマルチリンガルであることを準備されたデータベースを持って、すべてではないコードがあるので、私のクエリは次のようになります。このクエリはブロックする必要がありますか?

名前付きパラメータを使用しないクエリをブロックするように求められます。それは容易に強制することができます。パラメータを指定しないクエリをブロックするだけです。アプリケーション層でこれを行うことができます。しかし、上記のようなクエリをブロックするのは難しく、一方の値はパラメータであり、もう一方の値はパラメータではありません。あなたはそれを検出するためにそのクエリを解析する必要がありますが、それは難しいでしょう。

SQL Serverには、これを行うための機能が組み込まれていないと思います。

+0

私の体系では、1をパラメータとして渡す必要があります。永遠にSQLインジェクションを取り除くために支払う巨大な価格ではありません。 – nganju

+0

問題ではないバインド変数を使用します。データベースはこれらの値を自動的にエスケープする必要があります。 – GolezTrol

+0

これは当てはまりません。 ' - 'は文字列パラメータの中にあり、テキストとして扱われるか、パラメータは文字列ではなく、その値が ' - 'のときにはクエリは失敗します。いかなる場合でも、パラメータの値は別個のステートメントとして扱われるべきではありません。 – GolezTrol

関連する問題