English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> .net防sql注入代码

 

.net防sql注入代码

威盾防火墙 2014-12-04

 

添加sql防注入代码。  在global里面添加!

主要是通过HTTPModel来进行对客户端转过来的数据进行处理。一些通用的防注入方法中没有对cookie数据进行过滤,会给黑客留下可乘之机。当然这段代码对提交过来的cookie数据也进行了过滤。 

代码: 

using System;using System.Configuration; 
using System.Web; 
using System.Globalization; 
namespace JNYW.StuM.SqlInject 
{ 
    public class SqlstrAny : IHttpModule 
    {      
        public void Init(HttpApplication application) 
        { 
            application.BeginRequest += (new 
            EventHandler(this.Application_BeginRequest)); 
        } 
        private void Application_BeginRequest(Object source, EventArgs e) 
        {          
            ProcessRequest pr = new ProcessRequest(); 
            pr.StartProcessRequest(); 
        } 
        public void Dispose() 
        { 
        } 
    } 
    public class ProcessRequest 
    { 
        private static string SqlStr = System.Configuration.ConfigurationManager.AppSettings["SqlInject"].ToString(); 
        private static string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["SQLInjectErrPage"].ToString(); 
        /// 
        /// 用来识别是否是流的方式传输 
        /// 
        /// 
        /// 
        bool IsUploadRequest(HttpRequest request) 
        { 
            return StringStartsWithAnotherIgnoreCase(request.ContentType, "multipart/form-data"); 
        } 
        /// 
        /// 比较内容类型 
        /// 
        /// 
        /// 
        /// 
        private static bool StringStartsWithAnotherIgnoreCase(string s1, string s2) 
        { 
            return (string.Compare(s1, 0, s2, 0, s2.Length, true, CultureInfo.InvariantCulture) == 0); 
        } 
        
        //SQL注入式攻击代码分析 
        #region SQL注入式攻击代码分析 
        /// 
        /// 处理用户提交的请求 
        /// 
        public void StartProcessRequest() 
        { 
            HttpRequest Request = System.Web.HttpContext.Current.Request; 
            HttpResponse Response = System.Web.HttpContext.Current.Response; 
            try 
            { 
                string getkeys = ""; 
                if (IsUploadRequest(Request)) return; //如果是流传递就退出 
//字符串参数 
                if (Request.QueryString != null) 
                { 
                    for (int i = 0; i < Request.QueryString.Count; i++) 
                    { 
                        getkeys = Request.QueryString.Keys; 
                        if (!ProcessSqlStr(Request.QueryString[getkeys])) 
                        { 
                            Response.Redirect(sqlErrorPage + "?errmsg=QueryString中含有非法字符串&sqlprocess=true"); 
                            Response.End(); 
                        } 
                    } 
                } 
                //form参数 
                if (Request.Form != null) 
                { 
                    for (int i = 0; i < Request.Form.Count; i++) 
                    { 
                        getkeys = Request.Form.Keys; 
                        if (!ProcessSqlStr(Request.Form[getkeys])) 
                        { 
                            Response.Redirect(sqlErrorPage + "?errmsg=Form中含有非法字符串&sqlprocess=true"); 
                            Response.End(); 
                        } 
                    } 
                } 
              //cookie参数 
                if (Request.Cookies != null) 
                { 
                    for (int i = 0; i < Request.Cookies.Count; i++) 
                    { 
                        getkeys = Request.Cookies.Keys; 
                        if (!ProcessSqlStr(Request.Cookies[getkeys].Value)) 
                        { 
                            Response.Redirect(sqlErrorPage + "?errmsg=Cookie中含有非法字符串&sqlprocess=true"); 
                            Response.End(); 
                        } 
                    } 
                } 
            } 
            catch 
            { 
                // 错误处理: 处理用户提交信息! 
                Response.Clear(); 
                Response.Write("CustomErrorPage配置错误"); 
                Response.End(); 
            } 
        } 
          
        /// 
        /// 分析用户请求是否正常 
        /// 
        /// 传入用户提交数据 
        /// 返回是否含有SQL注入式攻击代码 
        private bool ProcessSqlStr(string Str) 
        { 
            bool ReturnValue = true; 
            try 
            { 
                if (Str != "") 
                { 
                    string[] anySqlStr = SqlStr.Split('|'); 
                    foreach (string ss in anySqlStr) 
                    { 
                        if (Str.IndexOf(ss) >= 0) 
                        { 
                            ReturnValue = false; 
                            break; 
                        } 
                    } 
                } 
            } 
            catch 
            { 
                ReturnValue = false; 
            } 
            return ReturnValue; 
        } 
        #endregion 
    } 
} 

在实际使用时,我们要在Web.config文件中的配置节中加上下面的代码 

以下是示例代码: 
在Web.Config文件的 <appSettings>中 
<!--防注入设置--> 
    <add value="and |exec |insert |select |delete |update |count | * |chr |mid |master |truncate |char |declare " key="SQLInject" /? 
    <add value="ShowErr.aspx" key="SQLInjectErrPage" /> 

并且在Web.Config文件的 <SYSTEM.WEB>中再加上下面的代码。 以下是示例代码: 
<!--防注入设置--> 
      <HTTPMODULES> 
          <add name="SqlstrAny" type="JNYW.StuM.SqlInject.SqlstrAny,SqlstrAny" /> 
      </HTTPMODULES> 
上面这个类的命名空间不需要修改直接独立添加上面那个类就行!!!!  



相关内容: 最新内容:
编写通用的ASP防SQL注入攻击程序[2014-12-04]
ASP防止SQL注入方法,有效杜绝SQL注入的代码[2014-12-04]
突破Sql防注入过滤[2014-12-04]
如何使用HttpModule实现sql防注入[2014-12-04]
如何从根本上防止 SQL 注入?[2014-12-04]
SQL注入攻击的总体思路[2014-12-04]
编写通用的ASP防SQL注入攻击程序[2014-12-04]
ASP防止SQL注入方法,有效杜绝SQL注入的代码[2014-12-04]
突破Sql防注入过滤[2014-12-04]
如何使用HttpModule实现sql防注入[2014-12-04]
如何从根本上防止 SQL 注入?[2014-12-04]
为什么选择手工WEB注入?工具的缺陷[2014-12-04]