我需要创建一个字符串方法,它接受一个字符串和 转义它以便它可以在数据库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#中完成。
对于之前没有提及的道歉:我没有使用参数查询的选项。
泰德
答案 0 :(得分:9)
通常的方法是使用参数化查询作为SqlCommand的一部分。
SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE MyCol = @param", connection);
command.Parameters.AddWithValue("@param", "This is john's dog");
然后,该框架可确保您的安全,与尝试自行解决所有可能的注入攻击相比,它更不容易出错。
答案 1 :(得分:2)
触发警告。这个答案是对以下声明的回应:
我没有选择使用参数化查询。
请不要对这个答案进行投票,请不要接受这是正确的做事方式。我不知道为什么OP不能使用参数化查询,所以我回答了这个具体问题而不建议你应该怎么做。如果您不是OP,请阅读我给出的其他答案。另外,在进行投票前请注意上述约束。感谢。
触发警告结束!
对于Microsoft SQL Server(答案因服务器而异),您需要转义单引号字符。
'
但是在你逃避这些角色之前,你应该拒绝不在白名单上的任何角色。这是因为有很多非常聪明的技巧,白名单验证比简单地逃避你知道不好的字符更安全。
Regex whiteList = new Regex("[^'a-zA-Z0-9 -]");
query = whiteList.Replace(query, "");
例如,这会删除[
和]
个字符,以及';'字符。您可能需要调整正则表达式以符合您的期望,因为这是一个非常严格的白名单 - 但您知道您期望在应用程序中看到哪种数据。
我希望这会有所帮助。请随时查看OWASP网站,了解有关安全性的更多详细信息,如果您能找到一种使用参数化查询的方法,那么您将会更好地睡眠。