当我使用以下SqlDataAdapter时,是否必须担心插入/更新/删除/注入攻击?

时间:2011-11-16 15:55:03

标签: c# sqldataadapter

当我使用以下代码时,是否需要执行任何操作以防止插入/更新/删除/注入攻击?

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只能用于'读'(即选择)。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

总的来说,我会说:是的,你必须这样做。

但也许Crystal Reports已经引用了SQL-String。自己尝试“攻击”并查看sqlSelectStatement包含的内容。