本帖最后由 songwenqi 于 2015-1-21 15:48 编辑  
 
【分布式系统框架教程】-黑名单白名单的使用方式 
 
     分布式马上就要升级了,请大家多多捧场。本次升级的项目中设计到过滤非法字符的功能。         平时,我们在做验证非法字符的时候,传统的做法是在每个页面需要传递参数或者有文本框输入的情况下进行验证,这种方式呢很不容易扩展,不方便维护和管理,我们知道,在vs项目下有个全局global.asax文件,也叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。我们可以使用这个文件实现应用程序安全性以及其它一些任务。这个文件中有个Application_BeginRequest方法,我们先来看看这个方法。 
 
    Application_BeginRequest:在接收到一个应用程序请求时触发。对于一个请求来说,它是第一个被触发的事件,请求一般是用户输入的一个页面请求(URL)。也就是说任何请求都会先执行这个方法,所以我们可以将我们验证字符的一些处理放在这个方法中。 
 
    首先我们需要在global.asax中定义两个静态的集合来作为黑名单和白名单。 
[C#] 纯文本查看 复制代码 public class Global : System.Web.HttpApplication
    {
        bool ischeck = true;
        #region 白名单
        public static List<string> Whitelist = new List<string>();
        #endregion
        #region 黑名单
        public static List<string> BlackList = new List<string>();
        #endregion
} 
 
    Application_Start:在HttpApplication 类的第一个实例被创建时,该事件被触发。它允许你创建可以由所有HttpApplication 实例访问的对象。我们在这个方法中添加对应的黑名单和白名单。 
[C#] 纯文本查看 复制代码  void Application_Start(object sender, EventArgs e)
        {
            // 在应用程序启动时运行的代码
            //添加白名单 白名单不做处理  这里可以添加多个白名单
            Whitelist.Add("www.sufeinet.com".ToLower());
            //添加黑名单  黑名单直接拉黑 这里可以添加多个黑名单
            BlackList.Add("xiaomi.com");
        } 
    然后在Application_BeginRequest方法中写我们的逻辑,对黑名单的字符进行过滤,对白名单不做处理等操作 
 
[C#] 纯文本查看 复制代码  void Application_BeginRequest(object sender, EventArgs e)
        {
            //处理非法字符串
            try
            {
                //首先判断该url是否在白名单中
                string url = (Request.Url.DnsSafeHost + Request.Url.AbsolutePath).ToLower();
                foreach (string item in Whitelist)
                {
                    if (url.Contains(item))
                    {
                        //白名单中的字符串不做检查
                        ischeck = false;
                        break;
                    }
                }
                if (ischeck)
                {
                    if (Request.QueryString != null && (!string.IsNullOrWhiteSpace(Request.QueryString.ToString())))
                    {
                        //检测字符串
                        CheckHtml(Request.QueryString.ToString());
                    }
                    if (Request.Form != null && (!string.IsNullOrWhiteSpace(Request.Form.ToString())))
                    {
                        //检测字符串
                        CheckHtml(Request.Form.ToString());
                    }
                }
            }
            catch { }
        }
        #region 非法字符处理方法
        /// <summary>
        /// 检查是否存在Html标签
        /// </summary>
        /// <param name="str">html字符串</param>
        private void CheckHtml(string str)
        {
            //首先判断黑名单 如在黑名单中直接跳到错误页
            foreach (var black in BlackList)
            {
                if (str.Contains(black))
                {
                    Redirect_Error();
                    break;
                }
            }
            //如不在黑名单中则判断是否包含非法字符串
            if (FilterHelper.CheckHtml(str))
            {
                Redirect_Error();
            }
        }
        private void Redirect_Error()
        {
            Response.Redirect("/Error/BanError.html");
        } 
        #endregion 
   这样每次请求都会先执行Application_BeginRequest方法,这样就达到了我们想要的结果,而且这种方式便于维护,当我们不想过滤某个字符时,就可以将其加入到白名单,加入黑名单的直接处理。 
 
 |