0

找到此代码用于防止使用 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

4 回答 4

4

当参数化查询为您(以及更多)工作时,为什么要执行字符串检查?

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

于 2012-10-31T16:42:40.673 回答
3

清理/过滤数据的黑名单方法从来都不是清理数据的最佳方法。(虽然在某些情况下是合适的,这取决于权衡)

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

黑名单正在针对负面输入列表测试所需的输入。基本上,您将编译所有负面或不良条件的列表,然后验证收到的输入不是不良或负面条件之一。白名单正在根据可能的正确输入列表测试所需的输入。为此,您将编译所有良好输入值/条件的列表,然后验证收到的输入是否是此正确条件之一。

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

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

于 2012-10-31T16:42:28.817 回答
2

不,这不好。

它将阻止有效输入,并且绝不会保护从错误/无效数据构造查询的代码。

假设传入的数据很糟糕,只需正确构造查询,您的情况就会好得多。

于 2012-10-31T16:42:07.413 回答
2

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

于 2012-10-31T16:42:18.993 回答