当我使用以下代码时,是否需要执行任何操作以防止插入/更新/删除/注入攻击?
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只能用于'读'(即选择)。
答案 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
包含的内容。