gpt4 book ai didi

c# - 你能只参数化where子句吗?

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:33 25 4
gpt4 key购买 nike

为了防止 sql 注入(inject),我尝试使用参数化查询。但我不清楚我是否应该只对 where 子句或查询的其他部分进行参数化。例如,我正在尝试改进以下查询:

string strQ = @";WITH lstTable as (
SELECT ROW_NUMBER() OVER(ORDER BY " + sort + @") AS RowNum, *
FROM (
SELECT *
FROM SystemMessage
WHERE Deleted = 0 ";`

此查询在网格中使用,根据用户的选择,它将按列名排序。在这种情况下我需要参数化“排序”吗?

最佳答案

对于此用例,您不能直接使用参数,这是正确的。但是,是否需要使用参数取决于 sort 的填充方式。

如果它是一个硬编码的列名列表,用户只需选择列表中的哪些索引将被选择,则您无需担心参数化,用户在查询中没有直接输入因此他们无法向其中注入(inject)代码。

如果用户直接提供列名,您必须在传递之前清理用户输入,一种方法是使用 sql 函数 QUOTENAME清理输入。

string strQ = @"
declare @query nvarchar(max)
set @query = ';WITH lstTable as (
SELECT ROW_NUMBER() OVER(ORDER BY' + QUOTENAME(@sortColumn) + ') AS RowNum, *
FROM (
SELECT *
FROM SystemMessage
WHERE Deleted = 0 '
exec sp_executesql @query";

它会做的是你传递给 @sortColumn 的任何字符串,它会正确地将 [ ] 包裹在该字符串值周围。然后它在动态生成的字符串中使用该 excaped 值并使用 sp_executesql 运行它。

重要说明,此示例当前仅适用于单个列名,您需要一个 QUOTENAME 和您想要添加到查询中的每列一个新参数。如果您确实尝试传入 FirstName, LastName 它将变为

;WITH lstTable as (
SELECT ROW_NUMBER() OVER(ORDER BY [FirstName, LastName]) AS RowNum, *
FROM (
SELECT *
FROM SystemMessage
WHERE Deleted = 0

执行时,它会尝试查找名为“[FirstName, LastName]”的列,但会失败。

关于c# - 你能只参数化where子句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com