这个用于防止MySQL注入的代码是好的吗?

时间:2012-10-31 16:37:21

标签: c# mysql sql-injection

找到此代码以防止使用HTTPModules进行一些基本的MySql注入

public class SampleSqlInjectionScreeningModuleCS : IHttpModule
{
    //Defines the set of characters that will be checked.
    //You can add to this list, or remove items from this list, as appropriate for your site
    public static string[] blackList = {"--",";--",";","/*","*/","@@","@",
                                       "char","nchar","varchar","nvarchar",
                                       "alter","begin","cast","create","cursor","declare","delete","drop","end","exec","execute",
                                       "fetch","insert","kill","open",
                                       "select", "sys","sysobjects","syscolumns",
                                       "table","update"};

    public void Dispose()
    {
        //no-op 
    }

    //Tells ASP.NET that there is code to run during BeginRequest
    public void Init(HttpApplication app)
    {
        app.BeginRequest += new EventHandler(app_BeginRequest);
    }

    //For each incoming request, check the query-string, form and cookie values for suspicious values.
    void app_BeginRequest(object sender, EventArgs e)
    {
        HttpRequest Request = (sender as HttpApplication).Context.Request;

        foreach (string key in Request.QueryString)
            CheckInput(Request.QueryString[key]);
        foreach (string key in Request.Form)
            CheckInput(Request.Form[key]);
        foreach (string key in Request.Cookies)
            CheckInput(Request.Cookies[key].Value);
    }

    //The utility method that performs the blacklist comparisons
    //You can change the error handling, and error redirect location to whatever makes sense for your site.
    private void CheckInput(string parameter)
    {
        for (int i = 0; i < blackList.Length; i++)
        {
            if ((parameter.IndexOf(blackList[i], StringComparison.OrdinalIgnoreCase) >= 0))
            {
                //
                //Handle the discovery of suspicious Sql characters here
                //
                HttpContext.Current.Response.Redirect("~/About.aspx");  //generic error page on your site
            }
        }
    }

}

这是一个好的代码还是你认为我需要在黑名单中添加更多东西,或者忘记这一点并尝试另一种方法来防止注射?

4 个答案:

答案 0 :(得分:4)

为什么parameterized queries会为你做这件事(以及更多)时执行字符串检查?

在您从代码发出的SQL语句中使用Parameters.Add()Parameters.AddWithValue()

答案 1 :(得分:3)

不,黑名单不能阻止SQL注入。有关绕过黑名单的方法,请参阅OWASP页面。您应该使用parameterized queries

答案 2 :(得分:3)

用于对数据进行santizing /过滤的黑名单方法 永远 是对数据进行santizing的最佳方法。 (虽然在某些情况下取决于权衡取舍是合适的)

这里有一个简单的解释:http://www.testingsecurity.com/whitelists_vs_blacklists

  

黑名单正在针对否定列表测试所需的输入   输入的。基本上你会编译一个所有负面或   恶劣的条件,然后验证收到的输入不是其中之一   坏的或消极的条件。白名单正在测试所需的输入   反对可能正确输入的列表。要做到这一点你会   编译所有良好输入值/条件的列表,然后验证   收到的输入是这个正确条件之一。

     

您认为哪个更好?攻击者将使用任何手段   可以访问您的基于Web的应用程序。这包括   尝试各种负面或恶劣的条件,各种编码   方法,并将恶意输入数据附加到有效数据。你呢   认为你可以想到可能存在的每一种可能的不良排列   发生?白名单是验证输入的最佳方式。你会知道   准确的是什么,并没有接受任何不良类型。   通常,创建白名单的最佳方法是使用   常用表达。使用正则表达式是一种很好的方法   抽象白名单,而不是手动列出每一个可能的   正确的价值。

您最好使用标准的,经过验证的防御措施:参数化查询参数化存储过程

答案 3 :(得分:2)

不,这不好。

它将阻止有效输入,绝不会保护构造查询不良/无效数据的代​​码。

只需正确构建查询,假设传入的数据很糟糕,你就会好多了。