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 回答