有类似
的东西CheckStringForSql(string);
对于C#?
我知道我可以使用参数,但我的一个存储过程使用sp_executeSQL,其参数来自xml文档。所以理论上任何人都可以运行sql命令,如果他们知道将它们放在哪里。
有什么想法吗?
答案 0 :(得分:4)
避免SQL注入的正确方法是parameterized queries,它实际上将任何不适合的值编码到它们被注入的SQL上下文中。
假设您知道很多遗留代码容易受到SQL注入攻击,您仍然可以尝试在代码的另一部分中检查输入上的可疑值。例如,默认情况下,ASP.NET tries to prevent javascript / HTML注入使用每个请求的过滤器。
但是这种方法对假阳性持开放态度,你拒绝完全合法的数据,因为它看起来像是注射攻击。并且它与使用最佳实践编写数据访问代码的可靠性差不多。
答案 1 :(得分:0)
关于如何编写安全代码以避免SQL注入,有数以千计的问题。疯狂的blog posts甚至comics talking about this problem
长话短说,你不能安全地做到这一点。您需要保护该XML文件,或重写您的代码。没有其他人会建议你。
答案 2 :(得分:0)
StriplingWarrior使用参数化字符串使其正确。但作为一个额外的安全级别,我认为检查输入字符串与白色字符列表有帮助。您可以通过使用正则表达式检查用户输入来执行此操作,如下所示:
public bool validateUserInputAgainstWhiteList(String pword)
{
// Gets only a string with letters of any size and any amount of numbers
var positiveIntRegex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9]*$");
// if pword does not meet regular expression then return false
if (!positiveIntRegex.IsMatch(pword))
{
return false;
}
else
{
return true;
}
}
如果你在下面的视频https://www.youtube.com/watch?v=8mSImYK3824
中转到5:30分钟左右它有助于证明这一点。