为了避免SQL Server中的SQL注入攻击,应该从字符串中转义的所有字符是什么?

时间:2013-10-15 12:53:23

标签: c# sql sql-server sql-server-2008 sql-server-2012

我正在编写一个小帮助程序库,它正在构建一些SQL并针对SQL Server数据库执行它。

我知道最好的方法是使用参数化查询而不是连接字符串,但这不是一个选项,因为我需要以简单的人类可读方式记录对数据库执行的所有查询,以便在管理员查看后,他们可以自由查看用于搜索的实际值在where子句中的含义。

在将该字符串放入查询并执行之前,我必须转义的所有字符是什么?

我知道单引号'是必须的,但是我必须关心别的吗?

以下是一些示例代码:

var condition = new Condition();
var table = new PersonTable();
condition.Add(table.Name.IsEqualTo("John's"));

这将转换为

WHERE [dbo].[Person].[Name] = N'John''s'

如果我仅接受string方法中的IsEqualTo并使用'转发单'',您如何攻击?

据我所知,SQL Server仅接受'字符串分隔符。

2 个答案:

答案 0 :(得分:9)

任何已知字符集中的每个字符。

现在使用经过验证和接受的技术。

答案 1 :(得分:-3)

您应该转义以下字符:

'-' because of '--' (comment)
'=' because of 1=1
'>' or '<' because of 1>0
'%' because of Like '%%'
char(39) because of it is equivalent to ' 
'"' because it can use in delimiters
'[',']' because it can use in delimiters