• asp.net简单实现利用HttpModule实现防sql注入


    关于sql注入,已经被很多人讨论过了。这篇没有新意功能也不够通用,nnd,不想引起口水,就是觉得简单而且思路有参考性才贴出来。
    1、新建一个类,实现IHttpModule接口

    代码
        public class SqlHttpModule : IHttpModule
        {
            
    public void Dispose()
            {

            }

            
    public void Init(HttpApplication context)
            {
                context.AcquireRequestState 
    += new EventHandler(context_AcquireRequestState);
            }
       }

     在实现接口的Init方法时,我们选择了AcquireRequestState事件,为什么不是Begin_Request事件呢?这是因为我们在处理的时候可能用到session,而Begin_Request事件执行的时候还没有加载session状态(关于HttpModule可以参考这一篇)。
    2、对网站提交的数据进行处理
    (1)、GET方式

    代码
      //url提交数据 get方式
                    if (context.Request.QueryString != null)
                    {
                        
    for (int i = 0; i < context.Request.QueryString.Count; i++)
                        {
                            key 
    = context.Request.QueryString.Keys[i];
                            value 
    = context.Server.UrlDecode(context.Request.QueryString[key]);
                            
    if (!FilterSql(value))
                            {
                                
    throw new Exception("QueryString(GET) including dangerous sql key word!");
                            }
                        }
                    }

     (2)、POST方式

    代码
            //表单提交数据 post方式
                    if (context.Request.Form != null)
                    {
                        
    for (int i = 0; i < context.Request.Form.Count; i++)
                        {
                            key 
    = context.Request.Form.Keys[i];
                            
    if (key == "__VIEWSTATE"continue;
                            value 
    = context.Server.HtmlDecode(context.Request.Form[i]);
                            
    if (!FilterSql(value))
                            {
                                
    throw new Exception("Request.Form(POST) including dangerous sql key word!");
                            }
                        }
                    }

     完整代码:

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;

    namespace DotNet.Common.WebForm
    {
        
    /// <summary>
        
    /// 简单防止sql注入 
        
    /// </summary>
        public class SqlHttpModule : IHttpModule
        {
            
    public void Dispose()
            {

            }

            
    public void Init(HttpApplication context)
            {
                context.AcquireRequestState 
    += new EventHandler(context_AcquireRequestState);
            }

            
    /// <summary>
            
    /// 处理sql注入
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            private void context_AcquireRequestState(object sender, EventArgs e)
            {
                HttpContext context 
    = ((HttpApplication)sender).Context;
                
    try
                {
                    
    string key = string.Empty;
                    
    string value = string.Empty;
                    
    //url提交数据 get方式
                    if (context.Request.QueryString != null)
                    {
                        
    for (int i = 0; i < context.Request.QueryString.Count; i++)
                        {
                            key 
    = context.Request.QueryString.Keys[i];
                            value 
    = context.Server.UrlDecode(context.Request.QueryString[key]);
                            
    if (!FilterSql(value))
                            {
                                
    throw new Exception("QueryString(GET) including dangerous sql key word!");
                            }
                        }
                    }
                    
    //表单提交数据 post方式
                    if (context.Request.Form != null)
                    {
                        
    for (int i = 0; i < context.Request.Form.Count; i++)
                        {
                            key 
    = context.Request.Form.Keys[i];
                            
    if (key == "__VIEWSTATE"continue;
                            value 
    = context.Server.HtmlDecode(context.Request.Form[i]);
                            
    if (!FilterSql(value))
                            {
                                
    throw new Exception("Request.Form(POST) including dangerous sql key word!");
                            }
                        }
                    }
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

            
    /// <summary>
            
    /// 过滤非法关键字,这个可以按照项目灵活配置
            
    /// </summary>
            
    /// <param name="key"></param>
            
    /// <returns></returns>
            private bool FilterSql(string key)
            {
                
    bool flag = true;
                
    try
                {
                    
    if (!string.IsNullOrEmpty(key))
                    {
                        
    //一般配置在公共的文件中,如xml文件,txt文本等等
                        string sqlStr = "insert |delete |select |update |exec |varchar |drop |creat |declare |truncate |cursor |begin |open|<-- |-->  ";
                        
    string[] sqlStrArr = sqlStr.Split('|');
                        
    foreach (string strChild in sqlStrArr)
                        {
                            
    if (key.ToUpper().IndexOf(strChild.ToUpper()) != -1)
                            {
                                flag 
    = false;
                                
    break;
                            }
                        }
                    }
                }
                
    catch
                {
                    flag 
    = false;
                }
                
    return flag;
            }
        }
    }

     3、在web项目中应用
    只要在web.config的httpModules节点下面添加如下配置即可。

        <httpModules>
          
    <add name="SqlHttpModule" type="DotNet.Common.WebForm.SqlHttpModule, DotNet.Common.WebForm"></add>
        
    </httpModules>

     需要说明的是,这个防止sql注入的方法在特定的小项目中还是很简洁高效的,但是不通用,通常我们都是选择参数化(利用orm或者ado.net的参数化)方式防止sql注入。

    附:asp.net在网页头部引入js脚本的简单方法
    asp.net开发少不了JavaScript的辅助。在通常项目中,js文件都组织在一个公共目录如js文件夹下。随着项目的深入,你会发现js脚本文件越来越多,公共的脚步库越来越庞大。实际使用的时候,我们通常都是在页面中通过 <script src="..." type="text/javascript" >形式引入js文件,而且引入的越来越多。下面我们就来简单讨论在每个页面引入公共脚本库的统一方式,而不用每个页面都是很多<script src="..." type="text/javascript" >的形式。
    和我们以前的做法一样,定义一个页面基类叫BasePage,事件和方法如下:

    Code

    这样就简单地解决了引入公共js的问题。同样的原理,你也可以引入其他类型的文件,如css等。
    demo下载:demo


    作者:Jeff Wong
    出处:http://jeffwongishandsome.cnblogs.com/
    本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

  • 相关阅读:
    Java中的事务
    ABCDE
    Android 防内存泄露handler
    自建应用新花样,菜鸟也会做应用
    软件測试之独步武林系列(一)
    刚在在win8.1下装了ubuntu12.04
    SVN 的一些操作
    [华为机试练习题]42.求二叉树的深度和宽度
    iOS_正則表達式
    在应用中更新App版本号
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1512551.html
Copyright © 2020-2023  润新知