2016-05-08 16 views
4

SQL Serverデータベースに接続されたC#アプリケーションを使用しています。データのセキュリティについて聞いたことがあるので、SQL Serverのストアドプロシージャで作業することにしました。C#SQLインジェクション

私の質問は、SQL Serverでストアドプロシージャを作成した後で、C#でコードが保護されているか、SQLインジェクションを防止していないのですか?正しいコードを使用しましたか?

SqlConnection con = new SqlConnection("Server = localhost;Database = test; Integrated Security = true"); 

SqlDataAdapter da = new SqlDataAdapter("selectdhena", con); // Using a Store Procedure. 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

DataTable dt = new DataTable("dtLista"); 
da.SelectCommand.Parameters.AddWithValue("@full_name", txt.Text); 

dtg.ItemsSource = dt.DefaultView; 
da.Fill(dt); 
+3

が、AddWithValueを使用しないでください。 SqlDbTypeで適切なAddを使用し、パラメータの予想されるサイズを – Steve

+0

私に例を与えてもらえますか?C#newになってしまいました。# – user5827232

+4

SQLインジェクション攻撃を避けるためにストアドプロシージャを使用する必要はありません。 –

答えて

2

短い答え:正しいコードを使用します。ストアドプロシージャは注入攻撃から保護されています。あなただけが、たとえば、ストアド・プロシージャ内EXECを使用している場合:

CREATE PROCEDURE dbo.CreateUserTable 
    @data systemData 
AS 
    EXEC('CREATE TABLE ' + @data + ' (column1 varchar(100), column2 varchar(100))'); 
GO 

攻撃者がアプリケーションにSQL Serverを停止します

a(c1 int); SHUTDOWN WITH NOWAIT;-- 

するデータを設定し、いくつかのコードを挿入できます。だからあなたのストアドプロシージャ内のより良いいくつかのチェックロジックを持っている:はい

CREATE PROCEDURE dbo.AlterUserTable 
    @data systemData 
AS 
    IF EXISTS(SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'dbo' 
       AND TABLE_TYPE = 'BASE TABLE' 
       AND TABLE_NAME = @data) 
BEGIN 
    // The table is known to exist 
    // construct the appropriate command here 
END 
GO 
関連する問題