SQL字符串参数中应该转义哪些字符?

4

我需要一个完整的字符列表,以防止在SQL字符串参数中发生异常。我假设在将其传递给我的ObjectDataSource过滤器参数之前,我需要用转义版本替换所有有问题的字符。


5
为什么你不使用带绑定变量的参数化SQL语句?如果你使用绑定变量,就永远不需要转义任何内容。 - S.Lott
1
难道没有参数集合吗?它非常适用于可变数量的参数。 - John Saunders
3
那么你是要自己编写代码,冒着 SQL 注入的风险等吗? - gbn
你仍然可以根据参数数量创建你的SQL,并且仍然可以从使用参数中获益。 - Jhonny D. Cano -Leftware-
2
查看这篇文章:http://stackoverflow.com/questions/1105643/help-production-db-was-sql-injected 当你"寻找简单的解决方案"时,就会得到这样的结果…… - marc_s
显示剩余4条评论
4个回答

3
不需要,ObjectDataSource会为您处理所有转义操作。任何参数化的查询也不需要进行转义。

这不是一个简单的肯定或否定的问题,兄弟。 - Slim
它在一定程度上是对的。您说:“我认为我需要替换所有违规字符”,而这并不正确。如果您不需要替换违规字符,则也不需要它们的列表。 - Andrew Hare
那么你的意思是,这不是我的假设? - Slim
1
好的,对于你的假设,我没有权力作出裁决,因为这是你个人的想法。然而,我要说的是,你明确陈述的假设是不正确的。 - Andrew Hare
你或者任何点赞了你回答的人能否向我展示如何使用ObjectDataSource进行参数化过滤? - Slim

1
正如其他人所指出的,在99%的情况下,当有人认为他们需要问这个问题时,他们是错误的。参数化是正确的方法。如果你真的需要转义自己,请尝试找出你的数据库访问库是否提供了这个功能(例如,MySQL有mysql_real_escape_string)。

在这种情况下,其他人是错误的。我试图进行过滤而不是选择。它从未触及数据库,因此不存在注入攻击的威胁。另外,ObjectDataSource不提供参数化过滤表达式,只提供占位符。 - Slim

0

SQL图书在线: 搜索字符串文字:

字符串文字

字符串文字由用引号括起来的零个或多个字符组成。如果一个字符串包含引号,那么这些引号必须被转义才能分析表达式。任何除了\x0000之外的双字节字符都可以在一个字符串中使用,因为\x0000字符是字符串的空终止符。

字符串可以包括其他需要转义序列的字符。下表列出了字符串文字的转义序列。

\a 警报

\b 退格

\f 换页符

\n 新行

\r 回车

\t 水平制表符

\v 垂直制表符

\" 引号

\ 反斜杠

\xhhhh 十六进制表示的Unicode字符


我正在寻找导致 SQL 字符串出现故障的字符列表。这些字符似乎都是 SQL 字符串友好的。 - Slim
关于我的最后一条评论。一些字符被用于SQL注入攻击,但由于通过ObjectDataSource FilterExpression是否真的可以实现注入攻击还存在疑问,所以我不担心它们。 - Slim

0

这里有一种我用来去掉撇号的方法。你可以用同样的方法处理其他你遇到的问题字符。(例子使用 VB.Net)

Dim companyFilter = Trim(Me.ddCompany.SelectedValue)

If (Me.ddCompany.SelectedIndex > 0) Then
      filterString += String.Format("LegalName like '{0}'", companyFilter.Replace("'", "''"))
End If

Me.objectDataSource.FilterExpression = filterString

Me.displayGrid.DataBind()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接