Asp.net 基于HTTP或SQL Server的SQL注入解决方案
我正在使用SQLServer2005和WindowsServer2000,我想知道在我支持代码的同时,是否有“自动”的方法来阻止SQL注入攻击 有些人建议有以下方法:Asp.net 基于HTTP或SQL Server的SQL注入解决方案,asp.net,sql-server-2005,sql-injection,Asp.net,Sql Server 2005,Sql Injection,我正在使用SQLServer2005和WindowsServer2000,我想知道在我支持代码的同时,是否有“自动”的方法来阻止SQL注入攻击 有些人建议有以下方法: 放入某种ISAPI或HTTP模块,该模块过滤请求post和查询字符串,以查找面向注入的符号,并在请求到达应用程序之前使其失败。这些解决方案中的大多数特定于IIS 6或更高版本。我跑了5英里 确保每个命令对象一次只运行一个SQL命令 我的配置还有其他想法吗?一般来说,没有自动解决方案来防止SQL注入。SQL注入是应用程序故障,而不是
我的配置还有其他想法吗?一般来说,没有自动解决方案来防止SQL注入。SQL注入是应用程序故障,而不是数据库故障
解决方案是让您对所有执行将应用程序数据插入查询的SQL的情况进行代码检查。一般来说,没有自动的解决方案来防止SQL注入。SQL注入是应用程序故障,而不是数据库故障
解决方案是让您对所有执行SQL将应用程序数据插入查询的情况进行代码检查。建议的解决方案: 确保每个命令对象 一次只运行一个SQL命令 时间 实际上并不能阻止注射。例如,攻击者可以插入登录查询,以便在没有凭据的情况下登录。考虑:
"SELECT COUNT(*) FROM Users WHERE UserId = '{0}' AND PassHash = '{1}'"
此模板可以注入以下用户ID:
' OR 1=1 --
屈服:
"SELECT COUNT(*) FROM Users WHERE UserId = '' OR 1=1 --' AND PassHash = 'sdfklahsdlg'"
集中精力消除代码中的漏洞。建议的解决方案: 确保每个命令对象 一次只运行一个SQL命令 时间 实际上并不能阻止注射。例如,攻击者可以插入登录查询,以便在没有凭据的情况下登录。考虑:
"SELECT COUNT(*) FROM Users WHERE UserId = '{0}' AND PassHash = '{1}'"
此模板可以注入以下用户ID:
' OR 1=1 --
屈服:
"SELECT COUNT(*) FROM Users WHERE UserId = '' OR 1=1 --' AND PassHash = 'sdfklahsdlg'"
集中精力消除代码中的漏洞。确保所有数据库调用都使用存储过程或参数化查询。确保所有数据库调用都使用存储过程或参数化查询。当我在服务器上多次尝试注入攻击时,我担心他们占用了不必要的资源。我在c#中编写了一个HttpModule(hacked!),它可以过滤掉大多数xss和sql注入攻击。代码粘贴在下面,以及使网站使用它所需的配置部分。它应该放在一个项目中,并编译成WebSecurityFilter.dll,然后web项目应该引用它(或者将它放在bin目录中) 这将只适用于asp.net,所以希望您的网站是基于asp.net的(我在评论中问过,但没有得到答案) Web配置部分(将其添加到:
模块代码(SecurityHttpModule.cs):
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Web;
使用System.Text.RegularExpressions;
命名空间WebSecurityFilter
{
类SecurityHttpModule:IHttpModule
{
类RegexWithDesc:Regex
{
字符串错误文本;
公共字符串错误文本
{
获取{return\u errorText;}
}
公共RegexWithDesc(字符串regex、RegexOptions选项、字符串errorText)
:base(正则表达式,选项)
{
_errorText=errorText;
}
}
///
///检测到安全冲突时显示错误文本
///
私有字符串\u errorhtml=
@"" +
@"" +
@"" +
@"" +
@"" +
@"" +
@“安全违规”+
@“
”+
//@“
”+
//@“走开”+
//@“
”+
@“
”+
@"{0}" +
@“
”+
@"" +
@"" +
@"" +
@"" +
@"";
//用于默认检查的正则表达式
// http://www.securityfocus.com/infocus/1768
静态RegexOptions _defaultRegexOptions=RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace;
RegexWithDesc[]\u regexCollection=new RegexWithDesc[]
{
新的RegexWithDesc(@“((¼| |¾)*)| javascript | unescape“,_defaultRegexOptions,“XSS 1”),//3.3
//新的RegexWithDesc(@“(\”)(\-\-)”,\u defaultRegexOptions,“SQL 1”),//2.1
新的RegexWithDesc(@“(=)[^\n]*(\'\-\-)|(;)”,\u defaultRegexOptions,“SQL 2”),//2.2
//新的RegexWithDesc(@“\w*(\”)(or)”,\u defaultRegexOptions,“sql3”),//2.3
新的RegexWithDesc(@“(\”)\s*(或| union | insert | delete | drop | update | create |(declare\s+@\w+),(u defaultRegexOptions,“SQL 4”),//2.4
新的RegexWithDesc(@“exec(((\s|\+)+(s|x)p\w+)(\s@)),_defaultRegexOptions,“sql5”)//2.5
};
#区域IHTTP模块成员
公共空间处置()
{
//无事可做
}
公共void Init(HttpApplication上下文)
{
context.BeginRequest+=新事件处理程序(context_BeginRequest);
}
void context_BeginRequest(对象发送方,事件参数e)
{
尝试
{
List toCheck=新列表();
foreach(HttpContext.Current.ApplicationInstance.Request.QueryString.AllKeys中的字符串键)
{
toCheck.Add(HttpContext.Current.ApplicationInstance.Request[key]);
}
foreach(HttpContext.Current.ApplicationInstance.Request.Form.AllKeys中的字符串键)
{
toCheck.Add(HttpContext.Current.ApplicationInstance.Request.Form[key]);
}
foreach(RegexWithDesc regex in_regexCollection)
{
foreach(toCheck中的字符串参数)
{
字符串dp=