确保字符串不是sql命令

时间:2014-06-20 16:36:31

标签: c# .net security sql-injection

有类似

的东西
CheckStringForSql(string);

对于C#?

我知道我可以使用参数,但我的一个存储过程使用sp_executeSQL,其参数来自xml文档。所以理论上任何人都可以运行sql命令,如果他们知道将它们放在哪里。

有什么想法吗?

3 个答案:

答案 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分钟左右

它有助于证明这一点。