Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 基于HTTP或SQL Server的SQL注入解决方案_Asp.net_Sql Server 2005_Sql Injection - Fatal编程技术网

Asp.net 基于HTTP或SQL Server的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注入是应用程序故障,而不是

我正在使用SQLServer2005和WindowsServer2000,我想知道在我支持代码的同时,是否有“自动”的方法来阻止SQL注入攻击

有些人建议有以下方法:

  • 放入某种ISAPI或HTTP模块,该模块过滤请求post和查询字符串,以查找面向注入的符号,并在请求到达应用程序之前使其失败。这些解决方案中的大多数特定于IIS 6或更高版本。我跑了5英里
  • 确保每个命令对象一次只运行一个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=