【发布时间】:2016-03-17 04:43:11
【问题描述】:
为了防止 sql 注入,我尝试使用参数化查询。但我不清楚我是否应该只参数化 where 子句或查询的其他部分。例如,我正在尝试改进以下查询:
string strQ = @";WITH lstTable as (
SELECT ROW_NUMBER() OVER(ORDER BY " + sort + @") AS RowNum, *
FROM (
SELECT *
FROM SystemMessage
WHERE Deleted = 0 ";`
此查询在网格中使用,根据用户的选择,它将按列名排序。在这种情况下我需要参数化“排序”吗?
【问题讨论】:
-
您不能参数化标识符,但您可以在 order by 子句中使用基于参数值的 case 表达式。
-
要么我对问题缺乏了解,要么您对问题缺乏了解。参数化查询不会(据我所知)阻止您进行 sql 注入。在发出 SQL 请求之前对数据进行清理将对您有更多帮助。
-
如果您的
sort值不是由用户输入,而是从列表中选择的,那么您没有 SQL 注入问题 - 否则,您会遇到。 -
@fiprojects 参数化查询肯定会阻止 SQL 注入。
-
@fiprojects 您能否提供示例 SQL 查询来演示您的语句(假设 SQL 查询中没有用户输入并且只允许使用参数)?
标签: c# sql sql-server