【问题标题】:Is this Sql-injection-proof Asp.net code?这是 Sql-injection-proof Asp.net 代码吗?
【发布时间】:2011-07-05 10:54:30
【问题描述】:

问题:我有一个带有文本值的表单,以及一个必须根据文本值的值返回字符串查询的函数。

解决方案:我创建了一个带参数的 SQLCommand 查询,然后将 SQLCommand.CommandText 放入一个字符串,然后将其返回(返回到要处理该查询的业务逻辑)

主要问题:它是 sql 注入证明吗?

代码示例:

sQuery = "select * from xy where x like '%@txtNameParameter%'";

SqlCommand cmd = new SqlCommand(sQuery);

cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
cmd.Parameters["@txtNameParameter"].Value = txtName.Text;

string query = cmd.CommandText;
return query;

如果主要问题没问题,则子问题: 我应该将单选按钮和下拉菜单的值也放入参数中,还是它们是防注入的?

【问题讨论】:

  • 上面的函数(?)只返回命令文本而命令对象本身就被废弃了?为什么不返回命令对象?
  • 因为我只需要返回查询的where子句。所以我在返回它之前所做的就是将它删除选择部分。这是因为字符串查询将被发送到已经具有选择部分的业务逻辑,并将带有 where 子句的字符串作为输入,我必须在这里进行注入证明。
  • 最好将控件的值发送到业务层,业务层进而可以决定如何驱动数据访问。它可以将值放入它可以实际使用的 SQL 命令中,而不是传递可能(并且很快)失控的 T-SQL Snippets
  • 我知道,我会这样做,但我无法控制数据访问,我必须处理这种情况。我返回的查询安全吗?
  • 我同意@Colin Mackay - 如果数据层允许您在其中传递任意 WHERE 子句,那是非常不寻常的。如果是这种情况,那么您可能不得不采用老式的方法,例如转义撇号和其他任何必要的方法。您可能还想与确实控制 DAL 的人交谈,并询问他们您打算如何正确处理此问题...

标签: asp.net parameters sql-injection sqlconnection sqlcommand


【解决方案1】:

您在这里所做的是防注入,因为您没有注入任何东西。事实上,您的参数甚至没有被使用(因为对它的唯一引用是在字符串文字中,因此 SQL 解析器甚至不会看到您尝试使用该参数的位置,因为它会将其视为字符串文字。)

您可能希望将该行代码更改为:

sQuery = "select * from xy where x like '%'+@txtNameParameter+'%'";

这会使 SQL 看起来像这样:

select * from xy where x like '%'+@txtNameParameter+'%'

这只是在 SQL 命令中需要字符串的地方进行字符串连接。

但是,你之后对你正在做什么的描述可能会把所有这些都从水中吹走。我不明白为什么您只想将查询的 where 子句发送到业务层。

此外,子字符串 WHERE 子句将不包含您放入参数中的数据。所以你不会得到更多的好处,只是返回

return "where x like '%@txtNameParameter%'";

参数值丢失。

【讨论】:

  • 一个很好的答案。最后一点是特别相关的一点,参数根本不会在代码中解释,只有当它们被发送到数据库时,所以将它们全部放入命令中什么都不做。
猜你喜欢
  • 2011-08-18
  • 2020-03-27
  • 2023-04-10
  • 2011-09-23
  • 2010-12-19
  • 2012-12-01
  • 2016-09-14
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多