0

ユーザーがテキストボックスに入力してデータベースに対して検索を実行できるようにすると、SQL インジェクションの可能性があります。私は正規表現を使うことができました、それが私の最初の考えです。しかし、私にはもっと良い考えがありました。入力した内容に SQL キーワードが含まれているかどうかを確認してみませんか。私は、C# を使用した ASP.NET プログラムで SQL Server データベースを使用しています。私が見つけることができる最高のものは、この記事にあります:

プログラムで SQL キーワード (予約語) を取得する方法はありますか

これはおそらくうまくいかないことですが、私の問題は、キーワードのリスト全体を入力する必要があることです。約100あります。検索してこの質問をする代わりに、今までにできることは確かです。しかし、もっと簡単な方法はありませんか?今私は行くつもりです:

1 ハッシュセットを作成する 2 すべてのキーワードをハッシュセット (cmon) に追加する 3 ハッシュセットに対してユーザー入力を検証する

ステップ 2 がはるかに簡単になることを期待しています。SQL インジェクションに関するその他の提案も大歓迎です。

4

3 に答える 3

2

検索テキストをストアド プロシージャに渡し、次のようなことをしている場合

WHERE search LIKE @inputParam  

SQL は、上記のフラグメントでインジェクションが発生することを許可しません。

ただし、文字列変数を作成してから EXEC @sql または sp_execute @SQL を使用すると、SQL インジェクションに対して脆弱になります。

于 2013-05-13T02:43:29.463 に答える
2

私の意見では、パラメータ化された SQL を使用して、SQL キーワードを完全にチェックするという問題を回避した方がよいでしょう。C# での例を次に示します (MS SQL Server を使用していると仮定します)。

using (SqlCommand sqlcmd = new SqlCommand("SELECT * FROM [MyDB].[dbo].[MyTable] WHERE [SomeColumn] = @SomeValue", sqlconnection))
{
    sqlcmd.Parameters.AddWithValue("@SomeValue", strUsersSearchString);

    // use sqlcmd.ExecuteReader() here 
    // or whatever you normally would
}

MSDN の別の例を次に示します。これは、パラメーター化された SQL を使用してストアド プロシージャを呼び出しています

于 2013-05-13T02:45:17.960 に答える
0

名前付きパラメーターを使用します。 Dapper-dot-netを使用すると、これを非常に簡単に行うことができます。

IEnumerable<Row> results = connection.Query<Row>("SELECT column FROM table WHERE title LIKE @query", new { query = "SEARCHTERM" });
于 2013-05-13T04:39:10.983 に答える