2016-04-14 25 views
1

stackoverflowは、自分の質問に正しい答えを常に与えることによって、私のコーディングのキャリアに大きく貢献しました。しかし、この質問は少し具体的かもしれません。うまくいけば、それはサイトへの最初の投稿なので厳しい回答は得られません。SQL Server 2012のSQLインジェクション

私は、ユーザーがさまざまな列を検索できるようにするSQL Server 2012ストアドプロシージャの作成に興味があります。私はそれが私が期待するものを格納されたprocを作成したと信じていますが、私はSQLインジェクションの試みが心配です。 SQLインジェクションを使用して、すべての利用可能なベースを念頭に置いたことがありますか?そうでない場合は、私のサンプル保存されたprocを回避する方法について私に教えてください。ご注意ください:記載されているものは、会社のデータ構造を保護するために変更されています。ストアドプロシージャ

CREATE PROCEDURE [dbo].[spSearch] 
(  
    @searchTerm varchar(50) = NULL 
) 
AS 

set @searchTerm = LTRIM(RTRIM(@searchTerm)); 

select a.ID 
     ,a.Col1 
     ,a.Col2 
     ,a.Col3 
     ,a.Col4 
     ,a.Col5 
     ,b.Col1 
from table1 a 
left join table2 b on a.ID = b.ID 
where (a.Col1 like '%' + @searchTerm + '%' 
    or a.Col2 like '%' + @searchTerm + '%' 
    or a.Col3 like '%' + @searchTerm + '%' 
    or a.Col4 like '%' + @searchTerm + '%' 
    or b.Col1 like '%' + @searchTerm + '%' 
    or b.Col2 like '%' + @searchTerm + '%' 
    or b.Col3 like '%' + @searchTerm + '%' 
    or b.Col4 like '%' + @searchTerm + '%' 
    or b.Col5 like '%' + @searchTerm + '%' 
    or b.Col6 like '%' + @searchTerm + '%') 
GO 

私の主な関心事は、50文字のVARCHARパラメータに敵対的なSQLコマンドを渡すと、それはさまざまなwhere句等のいずれで実行させるの働かです。

+1

パラメータを使用してSQLインジェクション攻撃をカバーしました。敵対的なコマンドは、敵対的なコマンドの文字列を検索しているかのように、単純な "検索テキスト"と見なされます。 –

+1

これはこのレベルでは問題ではありません。すでにパラメータ化されているため、あたかもパラメータの値を参照しているかのように動作します。 – Siyual

+0

ところで、このパラメータを取得してSQL Serverに送信する時点で、まだSQLインジェクション攻撃の穴が導入されている可能性があります。 –

答えて

0

本当にコードからSPを呼び出す方法によって異なります。ストアドプロシージャは、自己がSQLインジェクションから安全ではないということです。パラメータ化された関数を使用しているときは、おそらく問題ありません。文字列としてSQLクエリを送信しているときは、まだSQLインジェクションの問題があります。主な問題は、コード内の文字列の連結です。信頼できないソースからのパラメータがある場合、文字列の連結は安全ではありません。 Do Stored Procedures Protect Against SQL Injection?

基本的な教訓は、文字列連結なしでストアドプロシージャを書き込むことです。

+0

ありがとう、ピーター!私は、このストアドプロシージャを呼び出す際に文字列連結を使用する計画はないので、これはかなり安全なストアドプロシージャであると考えています。 – Wadeo

+0

あなたはsp: '%' + @searchTerm + '%'の文字列連結を行っています。だから、それ自体は安全ではありません。 spを呼び出す方法が、その使用法を安全にするようです。 – Peter