3

次のコードを使用している場合、挿入/更新/削除/インジェクション攻撃を防ぐために何かする必要がありますか?

public static DataSet getReportDataSet(string sqlSelectStatement)
{
    SqlDataAdapter da = new SqlDataAdapter(sqlSelectStatement, new SqlConnection(GlobalVars.ConnectionString));
    DataSet reportData = new DataSet();
    da.Fill(reportData, "reportData");
    return reportData;
}

この背後にある考え方は、一連の Crystal Reports から SQL を抽出し、MS SQL Server から各レポートのデータを取得し、データをレポートにバインドしてから、入力されたレポートを PDF にエクスポートするというものです。

組み込み機能を使用してレポートに独自のデータを取得できることはわかっていますが、私のテストでは、データをレポートにプッシュする方がはるかに高速であることが示されています。これに関する私の唯一の問題は、実行されるレポートを制御できないことです。

人々は、SQL Server への独自のログイン資格情報を提供する必要があるため、権限のあるデータベースからのデータのみを表示できます...しかし、一部のユーザーは書き込み権限を持っており、それが心配です。 Crystal Report から取得した SQL 文字列をやみくもに実行すると、挿入/更新/削除/インジェクション攻撃が可能になる可能性があります...

私は何も心配していないのではないかと思いますが、これが選択以外のものに使用できるかどうかを明確に述べているものは何も見つかりません.

編集:

したがって、最初のコメントから、SELECT 以外の SQL ステートメントについて心配する必要があると思います。したがって、私の質問は次のようになります。SqlConnection を「読み取り」(つまり、選択) にのみ使用できるように指定する方法はありますか。

4

2 に答える 2

2

問題はアダプターではありません。問題は、SQL コマンドにパラメーターを渡す方法です。次のようなことをしてはいけません

string sql = "SELECT * FROM t WHERE name='" + name +"'";

代わりにパラメーターを使用します。

SqlCommand cmd = new SqlCommand(SELECT * FROM t WHERE name = @name", conn);
SqlParameter param  = new SqlParameter();
param.ParameterName = "@name";
param.Value = "John Doe";
cmd.Parameters.Add(param);
于 2011-11-16T16:02:28.277 に答える
1

一般的に私はこう言います:はい、そうしなければなりません。

しかし、Crystal Reports はすでに SQL-String を引用している可能性があります。自分で「攻撃」を試して、何sqlSelectStatementが含まれているかを確認してください。

于 2011-11-16T15:58:58.037 に答える