2

私の VB.net ページには、SQL ステートメントを受け入れ、SQL ヘルパーの ExecuteDataSet コマンドを使用して DataSet を返すテキスト ボックスがあります。Delete、Truncate、Drop、Insert などのステートメントが実行されないようにする最善の方法は何だと思いますか? テキスト ボックスは、Select ステートメントのみを受け入れる必要があります。Javascriptまたはサーバー検証を介して入力文字列をトラップすることを考えていますが、これを行うためのより効率的なアイデアがあると確信しています。前もって感謝します。

編集: テキスト ボックスはクエリ アナライザーのように機能するため、SQL ステートメントの行を受け入れ、入力された文字列に基づいてデータセットを返します。

4

4 に答える 4

5

First, let me state for the record that your design is a really bad idea; you are exposing your database to great risk.

A better design would be to let your users select from a list of fields that they can select. This avoids allowing a user to type in a SQL statement.

However, if you are absolutely determined to do this, then build an array of the keywords you want to block. Then, after the user input, loop through the array checking for any of the blocked words. If any of the blocked words are found, then you don't execute the SQL.

It's a bad idea, though. You shouldn't do this.

于 2013-03-15T03:40:38.290 に答える
1

SQL インジェクションを防ぐ方法の 1 つは、動的に生成された SQL をコードで使用しないようにすることです。パラメータ化されたクエリとストアド プロシージャを使用することで、アプリケーションに対して SQL インジェクションが発生するのを防ぐことができます。

パラメーターを渡すことで、多くの種類の SQL インジェクション攻撃を回避できます。データベース アクセスを保護するさらに優れた方法は、ストアド プロシージャを使用することです。ストアド プロシージャは、データベース内のオブジェクトを特定のアカウントに制限し、アカウントにストアド プロシージャの実行のみを許可することで、データベースを保護できます。コードは、ストアド プロシージャを実行するためだけにアクセスできるこの 1 つのアカウントを使用して、すべてのデータベース アクセスを行います。このアカウントに、攻撃者が SQL ステートメントに入力してデータベースに対して実行できるようにする書き込みなどの他のアクセス許可を提供しないでください。

于 2013-03-15T04:23:43.690 に答える
1

DWRoeland が回答した内容に沿って、ユーザーのテキスト入力を使用してクエリを作成することを主張する場合は、入力の厳しいスクリーニングが必要になります。

ただし、提案とは対照的に、ホワイトリスト アプローチを使用することをお勧めします。許可されたキーワードの事前定義されたコレクションを持つことです。許容できないものをすべてブロックしようとするよりも、許容できるものをスクリーニングする方がはるかに簡単です。

追加の注意:
ドロップダウン リスト アプローチを選択してクエリを作成する場合でも、ユーザーはポストバックの前にこれらの値を改ざんしてデータベースに大損害を与える可能性があるため、値を検証する必要があります。

于 2013-03-15T04:51:54.967 に答える
1

これを行う方法はたくさんありますが、私は通常、sp_executesql とパラメーターを使用して動的 SQL をコーディングします。BOL の例を次に示します。

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

/* Build the SQL string one time.*/
SET @SQLString =
     N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID
       FROM AdventureWorks2008R2.HumanResources.Employee 
       WHERE BusinessEntityID = @BusinessEntityID';
SET @ParmDefinition = N'@BusinessEntityID tinyint';
/* Execute the string with the first parameter value. */
SET @IntVariable = 197;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 109;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                  @BusinessEntityID = @IntVariable;

Sp_executesql を使用すると、パラメーターを動的コードに入れることができ、それらは変数のように扱われます。そうすれば、誰かがコードをフィールドに挿入しようとすると、「挿入」されたコードは列に格納されます。

于 2013-03-15T03:40:22.490 に答える