繁体   English   中英

SQL 使用“AS QUERY”防止注入

[英]SQL injection prevention with 'AS QUERY'

我有以下代码,看起来很标准,但是在查询中是另一个 SQL 语句,因此为什么“AS QUERY”位于 SQL 字符串的末尾。 我想知道是否有一种复杂的方法来参数化以下 SQL 命令,而不是将整个查询连接在一起。

我能想到的唯一解决方案是将查询作为字符串而不是将其作为SQLCommand类型 object 并启动 2 个命令。 1 可以,另一个可以显示数据的预览。

public static CommandStatus<int> GetQueryRecordCount(SqlConnection connection, String query)
{
    String sql = "SELECT COUNT(1) FROM (" + query + ") AS QUERY";
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    cmd.Connection = connection;
    cmd.CommandTimeout = GetTimeout();

    try
    {
        SqlDataReader dataReader = cmd.ExecuteReader();
        dataReader.Read();

        String count = dataReader[0].ToString();
        dataReader.Close();

        return new CommandStatus<int>(Int32.Parse(count));
    }
    catch (Exception e)
    {
        return new CommandStatus<int>("Failed to GetQueryRecordCount[" + sql + "]:" + e.Message, e);
    }
}

字符串 SQL 最终会变成这样

"SELECT COUNT(1) FROM (SELECT TOP 20 [RecordID],[Name],[SonsName],[DadsName],[MothersName],[DaughtersName] FROM [dbo].[sample] ) AS QUERY"

这个 function 字面意思是 SQL 设计注入。

将 SQL 查询列入白名单function 将接受是使其安全的唯一方法。

也就是说,调用者将无法注入任何SQL 查询,他们只能从预先审查的固定查询列表中进行选择。 该列表甚至可以定义为您显示的 function 中的 static 字符串数组。

但是他们不需要将整个查询作为字符串传递,他们只需要传递一个序数 integer 来识别要运行白名单中的哪个查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM