2017-06-19 14 views
1

DALのコード例プロシージャを実行するこの方法はSQLインジェクションから安全ですか?

私はデータベースとしてc#とSQL SERVERを使用しています。

私はparametesとSQLインジェクションについて語っトピックを見つけましたが、私はこのことについて知りたい

をされたDbCommandを使用して、データベースオブジェクトのシングルトン、および例MSSQLから手順をexceute 機能、 を書いて、データベース・AddInParameter

private Database m_db; 
public Database getDB 
{ 
     get 
     { 
      if(m_db == null) 
        m_db = DatabaseFactory.CreateDatabase("ConnectionString"); 
      return m_db; 
     } 
} 


public void Example(string Name) 
{ 
    DbCommand dbcmd = getDB.GetStoredProcCommand("dbo.Example"); 
    getDB.AddInParameter(dbcmd, "p_Name", DbType.String, Name); 
    getDB.ExecuteNonQuery(dbcmd); 
} 

おかげ

+0

これは、C#側から大丈夫ですとクエリでのprocパラメータを使用しています。 –

+1

SP内に格納されているコマンドの種類によってまったく異なります。 C#側では 'AddInParameter'を使用するのが安全ですが、SQL側では文字列連結を使用する動的クエリが含まれている場合は別のものになる可能性があります。 –

+0

私はクエリとして文字列連結を使用しない限り、SQLインジェクションから安全でしょうか? @TetsuyaYamamoto –

答えて

1

dbo.Example手順は間違いなく、まだQUを実行することができ、特定の方法例えば、安全ではありませんERY:それはあなたの手順がどのように見えるかもよるが

create proc dbo.Example (@pName varchar(100)) 
as 
    declare @cmd varchar(max); 
    set @cmd = 'select Somedata from Sometable where Somecolumn = '+ @pName; 
    exec (@cmd); 

安全なコードは、正確にパラメータ

create proc dbo.Example (@pName varchar(100)) 
as 
    select Somedata from Sometable where Somecolumn = @pName; 
+0

正しい、@またはあなたが持っている両方のメソッド(この観点から安全なあなたが持っているC#コード)を呼び出すメソッドを考慮する必要がありますが、ストアドプロシージャがそれらの変数をどのように消費するか。 2つの重要な原則:すべてをパラメータ化し、安全でない可能性のある変数とクリーンなクエリを混ぜ合わせてはいけません。 – pcdev

+0

1.「クリーンクエリ」とはどういう意味ですか? 2.上記の手順を 'exec(@ cmd)'という文字列で実行せずにnormalyを実行すると安全ですか? 'それはソース化どのような方法であればSomecolumn = + @ pName' @pcdev –

+0

1.何かが "汚い" と見なされSometable からsomeDataが を選択 としてのproc dbo.Example(@pNameのVARCHAR(100)) を作成信頼できない入力からつまり、ユーザーが入力した文字列だけでなく、ファイル、データベースフィールドからロードされたデータ、またはWebサイトからダウンロードされたデータ(これらはすべて危険にさらされる可能性があります)を意味します。文字列のソースを完全に制御できない場合、それは「汚い」ので、非常に注意深く処理する必要があります。 – pcdev

関連する問題