2011-01-26 28 views
7

この状況について疑問を持っています。Like句とSQLインジェクション

私は、ストアドプロシージャ内でこのようなクエリをしました:

SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

私の質問は、これは、SQLインジェクションの脆弱性はありますか?私はこのようなものに変更する必要があります:(?)

declare @column1Like nvarchar(200); 

@column1Like = '%' + @column1 + '%' 

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

よろしく

答えて

6

クイックアンサーはありません。 SQLインジェクションに脆弱であるためには、動的SQL実行を使用する必要があります。

このは脆弱になります:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like); 

することも、(少なくとも、セキュリティの観点から)あなたの例の両方に実質的な違いがないことを意味します。

1

それはすでにSQL空間での文字列値であるので、それは脆弱ではありません。しかし、それはクエリを壊す可能性があります。

2
SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

このクエリは変数のみで動作しますので、コードの代わりにデータを置く場所がないので、SQLインジェクションに対して脆弱ではありません。

@column1ここではSQL Server変数であり、クライアント側の言語でパラメータ化されたクエリ機能を使用して値をバインドしていることを前提としています。

+1

のような別の例では、はい、私はセキュリティ上の問題について非常に慎重だと思う必要があります。しかし、私はこれを捕まえなかった:P –

1

パラメータ化クエリを使用しているため、どちらの場合でもクエリにSQLインジェクションが発生することはありません。

2

Likeが=や他の述語と異なることはありません。

ただし、追加のワイルドカード文字(%_)をパターンに挿入できます。それが問題ならば。

-1

私はそれは例えば、脆弱だと思う:あなたは@column1Likeのようにそれをフォーマットドント場合 「%」または1 = 1-- は、データベースのすべてのレジスタを表示します。この場合

は、私が (@column1Like= ''または@column1Like is null)よりも、同じit'sと思いますが、あなたは

'%' union select SELECT `column11`, `column22` 
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`. 
関連する問題