C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SQLインジェクション対策について


(過去ログ 110 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■65442 / inTopicNo.1)  SQLインジェクション対策について
  
□投稿者/ mog (1回)-(2013/02/25(Mon) 19:06:46)

分類:[.NET 全般] 

VisualStudio2010(C#)
SQLServer 2008 R2

SQLインジェクション対策について

動的にSQL文を組み立てる場合はSQLインジェクション対策を行う必要があると思いますが、
以下のようなストアドプロシージャの場合でも動的にSQL文を組み立てていることになるのでしょうか?

CREATE PROCEDURE TEST
(
  @i_id CHAR(1)
)
AS
SELECT id,name from sample WHERE id = @i_id

このような場合でも、パラメータまで含めて文字列とし、
「sp_executesql」で実行する必要があるのでしょうか?

CREATE PROCEDURE TEST
(
  @i_id CHAR(1)
)
AS
DECLARE @param NVARCHAR(MAX)
DECLARE @sql NVARCHAR(MAX)
BEGIN
    SET @param = N'@i_id CHAR(1)'
    SET @sql = 'SELECT id,name from sample WHERE id = @i_id'

    EXEC sp_executesql @sql,@param,@i_id
END


ちなみにC#からは以下のような感じで実行しています。
using (SqlCommand command = con.CreateCommand()) 
{
    command.CommandText = "TEST";
   command.CommandType = CommandType.STOREDProcedure;
    SqlParameter parameter = command.CreateParameter();

    parameter.ParameterName = "@i_id";
    parameter.Value = "a";
    command.Parameters.Add(parameter);

    command.ExecuteNonQuery();
}
(迷惑投稿者と判定されてしまうようなので、STOREDは全角にしています。)

WEB上でいろいろと検索しているのですが、
上記のようなシンプルなストアドの場合の情報がなかなか見つかりません。
よろしくお願いいたします。

引用返信 編集キー/
■65443 / inTopicNo.2)  Re[1]: SQLインジェクション対策について
□投稿者/ shu (205回)-(2013/02/26(Tue) 07:35:01)
No65442 (mog さん) に返信
> CREATE PROCEDURE TEST
> (
> @i_id CHAR(1)
> )
> AS
> SELECT id,name from sample WHERE id = @i_id
この場合はインジェクションの可能性はないと思います。
パラメータの内容によりSQL文に意図しない処理が埋め込まれることは
ないからです。

> このような場合でも、パラメータまで含めて文字列とし、
> 「sp_executesql」で実行する必要があるのでしょうか?
>
> CREATE PROCEDURE TEST
> (
> @i_id CHAR(1)
> )
> AS
> DECLARE @param NVARCHAR(MAX)
> DECLARE @sql NVARCHAR(MAX)
> BEGIN
> SET @param = N'@i_id CHAR(1)'
> SET @sql = 'SELECT id,name from sample WHERE id = @i_id'
>
> EXEC sp_executesql @sql,@param,@i_id
> END
この場合にはないですが動的に作成した方がインジェクションの可能性が
高くなります。

ストアド内の処理はパラメータを渡す記述が多いと思うのでストアド内でインジェクションに
なるのは少ないと思います。クライアント側でSQL文を作成している箇所をよくチェック
された方がよいと思います。

引用返信 編集キー/
■65444 / inTopicNo.3)  Re[2]: SQLインジェクション対策について
□投稿者/ mog (3回)-(2013/02/26(Tue) 10:47:37)
No65443 (shu さん) に返信

返信ありがとうございます。

>>CREATE PROCEDURE TEST
>>(
>> @i_id CHAR(1)
>>)
>>AS
>>SELECT id,name from sample WHERE id = @i_id
> この場合はインジェクションの可能性はないと思います。
> パラメータの内容によりSQL文に意図しない処理が埋め込まれることは
> ないからです。

「SqlParameter」を使用して渡した引数を使用する場合は
2重にパラメータ化する必要はないという事で理解しました。

ストアド内で抽出した値を使用して動的にSQL文を組み立てる場合などに
sp_executesqlとパラメータを使用するのかなぁと。
(間違っていたら教えてください。)

> ストアド内の処理はパラメータを渡す記述が多いと思うのでストアド内でインジェクションに
> なるのは少ないと思います。クライアント側でSQL文を作成している箇所をよくチェック
> された方がよいと思います。

マスタデータの取得部分などでSQLを書いてしまうことが多かったのですが、
今後は原則としてクライアント側ではSQL文を組み立てない方向で進めようと思います。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -