0

我需要创建一个字符串方法,它接受一个字符串并将其转义,以便它可以在数据库 SQL 查询中使用,例如:

"This is john's dog" ==> "This is john''s dog"
"This is a 'quoted' string" ==> "This is a ''quoted'' string"

我希望我的方法看起来像这样:

string PrepareForSQLCommand(string text)
{
    ...
} 

无论如何,我不知道 SQL 查询中需要转义的所有字符。我不确定执行此操作的最佳方法是什么,或者是否有一些现有的强大的内置东西可以在 C# 中执行此操作。

很抱歉之前没有提到这一点:我没有使用参数化查询的选项。

泰德

4

2 回答 2

9

执行此操作的常用方法是使用参数化查询作为 SqlCommand 的一部分。

SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE MyCol = @param", connection);
command.Parameters.AddWithValue("@param", "This is john's dog");

然后,该框架为您确保安全,这比尝试自己解决所有可能的注入攻击更不容易出错。

于 2013-01-30T22:23:06.623 回答
3

触发警告。此答案是对以下声明的回应:

我没有使用参数化查询的选项。

请不要对此答案投票,也请不要接受这是正确的做事方式。我不知道为什么 OP 不能使用参数化查询,所以我正在回答那个特定的问题,而不是建议你应该这样做。如果您不是 OP,请阅读我给出的其他答案。另外,在否决投票之前,请记住上述限制。谢谢。

触发警告结束!

对于 Microsoft SQL Server(答案因服务器而异),您需要转义单引号字符。

'

但在您转义这些字符之前,您应该拒绝任何不在您的白名单上的字符。这是因为那里有很多非常聪明的技巧,而且白名单验证比简单地转义你知道不好的字符更安全。

Regex whiteList = new Regex("[^'a-zA-Z0-9 -]");
query = whiteList.Replace(query, "");

例如,这将删除[]字符,以及 ';' 人物。您可能需要调整正则表达式以符合您的期望,因为这是一个非常严格的白名单 - 但您知道您希望在应用程序中看到什么样的数据。

我希望这有帮助。随时查看 OWASP 网站以获取有关安全性的更多详细信息,如果您能找到一种使用参数化查询的方法,您会睡得更好。

于 2013-01-30T23:13:48.330 回答