[英]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.