找到此代码以防止使用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
}
}
}
}
这是一个好的代码还是你认为我需要在黑名单中添加更多东西,或者忘记这一点并尝试另一种方法来防止注射?
答案 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)
不,这不好。
它将阻止有效输入,绝不会保护构造查询不良/无效数据的代码。
只需正确构建查询,假设传入的数据很糟糕,你就会好多了。