一个较完整的关键字过滤解决方案(上)

如果您希望看到关键字过滤算法的话那么可能就要失望了。博客园中已经有不少关于此类 算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考 使用。而本文的目的,是给出一个较为完整的关键字过滤功能,也就是将用户输入中的敏感 字符进行替换——这两者有什么区别?那么就请继续看下去吧。:) 有趣的需求

关键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一 件非常费神费事的事情。尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处, 而急需对所有输入进行关键字过滤时,上述做法更可谓“远水解不了近渴”。这时候,如果 有一个通用的办法,呼得一下为整站的输入加上了一道屏障,那该是一件多么惬意的事情。 这就是本文希望解决的问题。是不是很简单?我一开始也这么认为,不过事实上并非那么一 帆风顺,而且在某些特定条件下似乎更是没有太好的解决方法……

您慢坐,且听我慢慢道来……

实现似乎很简单

数据结构中的单向链表可谓无比经典。有人说:单向链表的题目好难啊,没法逆序查找, 很多东西都不容易做。有人却说:单向链表既然只能向一个方向遍历,那么变化就会很有限 ,所以题目不会过于复杂。老赵觉得后者的说法不无道理。例如在现在的问题上,我们如果 要在一个ASP.NET应用程序中做一个统一的“整站方案”,HttpModule似乎是唯一的选择。

思路如下:我们在Request Pipeline中最早的阶段(BeginRequest)将请求的 QueryString和Form集合中的值做过滤,则接下来的ASP.NET处理过程中一切都为“规范”的 文字了。说干就干,不就是替换两个NameValueCollection对象中的值吗?这再简单不过了:

public class FilterForbiddenWordModule : IHttpModule
{
   void IHttpModule.Dispose() { }
   void IHttpModule.Init(HttpApplication context)
   {
     context.BeginRequest += new EventHandler(OnBeginRequest);
   }
   private static void OnBeginRequest(object sender, EventArgs e)
   {
     var request = (sender as HttpApplication).Request;
     ProcessCollection(request.QueryString);
     ProcessCollection(request.Form);
   }
   private static void ProcessCollection(NameValueCollection collection)
   {
     var copy = new NameValueCollection();
     foreach (string key in collection.AllKeys)
     {
       Array.ForEach(
         collection.GetValues(key),
         v => copy.Add(key, ForbiddenWord.Filter(v)));
     }
     collection.Clear();
     collection.Add(copy);
   }
}

时间: 2024-10-03 21:04:09

一个较完整的关键字过滤解决方案(上)的相关文章

艾伟:一个较完整的关键字过滤解决方案(上)

如果您希望看到关键字过滤算法的话那么可能就要失望了.博客园中已经有不少关于此类算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考使用.而本文的目的,是给出一个较为完整的关键字过滤功能,也就是将用户输入中的敏感字符进行替换--这两者有什么区别?那么就请继续看下去吧.:) 有趣的需求 关键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情.尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤

一个较完整的关键字过滤解决方案(下)

在这篇文章里,我们来针对一些问题进行讨论.如果您觉得有哪些您感兴趣但是没有涉及 到的问题则请在评论中补充,我会修改文章添加一下内容.陷阱何在? 首先,我们来分析上一篇文章最后谈到的"陷阱".很可惜啊,过了两个星期还是没有朋 友能够指出这个问题,其实很简单,运行一下就能发觉有异常抛出: public partial class Default : System.Web.UI.Page, IForbiddenWordFilter { ... FilterForbiddenWordType

一个较完整的关键字过滤解决方案(中)

问题远没结束 上面的问题解决了没有?哦哦,我是指采取命名约定的方式来改变过滤行为.当然有问题 ,不过我这里提一下比较重要的两个: 首先,就是"改名"这种行为--究竟是否方便?还记得我们的需求吗(提示一下:方便 .通用--)?如果采取上面的命名约定方案,我们可能就需要在页面的前端和后端都不断 地改名,一会儿加-noffw,一会儿加-json.如果项目只由您来负责这还好办,只是麻烦一些 ,但是如果您的团队中的前台开发人员性格古怪,固执己见,不愿配合怎么办(打架我喜欢 ,可惜不能直接解决问题

一个简单的关键字过滤算法

早上看到老赵的<一个较完整的关键字过滤解决方案(上)>文章,讲到怎样在项目中嵌 入过滤方案的问题,以及提到 xingd 和 sumtec 两位大师发表的系列互拼的文章,在此我也 忍不住谈谈自己遇到的问题以及一个的简化版的算法. 因为过滤关键字机制到处可见,于是聪明的网友就会想到各种各样的方法突破,例如: 1.中文会用繁体字的方法避开关键字扫描 2.在关键字中间插入无意思的特殊字符,例如 * & # @ 等,而且个数可变 3.使用谐音或拆字法变换关键字 在实现自己的算法时也有些问题: 4

艾伟:一个简单的关键字过滤算法

早上看到老赵的<一个较完整的关键字过滤解决方案(上)>文章,讲到怎样在项目中嵌入过滤方案的问题,以及提到 xingd 和 sumtec 两位大师发表的系列互拼的文章,在此我也忍不住谈谈自己遇到的问题以及一个的简化版的算法. 因为过滤关键字机制到处可见,于是聪明的网友就会想到各种各样的方法突破,例如: 1.中文会用繁体字的方法避开关键字扫描2.在关键字中间插入无意思的特殊字符,例如 * & # @ 等,而且个数可变3.使用谐音或拆字法变换关键字 在实现自己的算法时也有些问题: 4.随着时

难道这里就没有高人吗,一个DATAGRIDVIEW多表头的问题,网络上没有一个真正公开的,可靠的解决方案

问题描述 难道这里就没有高人吗,一个DATAGRIDVIEW多表头的问题,网络上没有一个真正公开的,可靠的解决方案,1.要么是用treeview,但我觉的差强人意,2.我说是的C#下的,有的人不给完整的方案,只有部分源码,好多人都望洋兴叹,,好多人都盼望可用的解决方案, 解决方案 解决方案二:使用虚拟行新增几行加到rows[0]处,然后锁定这几个虚拟行就是了,这个是一个比较简单的做法复杂的做法是CellPainting里直接重绘如果你愿意用第三方控件的话,DeveloperExpress的xtr

在FreeBSD上建立一个功能完整的邮件服务器

#1 在FreeBSD上建立一个功能完整的邮件服务器 第一部分:安装邮件服务器:postfix+vm-pop3d+openwebmail 欢迎大家转贴这个文章,但要保留下面的版权信息: 作者:llzqq 联系:llzqq@126.com 以下的安装在FreeBSD 5.2.1系统上完成 1.更新 ports # cvsup -gL 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile 2.安装 openssl+ap

itext 每一个PdfPTable完整显示在同一个页面

问题描述 itext 每一个PdfPTable完整显示在同一个页面 如题,我想用itext生成一份pdf,但是我想让每一个PdfPTable都完整地显示在 同一个页面上而不是分页.PdfPTable可以自动适应页面大小而让内容自动缩放吗? 解决方案 没有听说有这种功能.难道表格很大很大,也要自动缩小到一页上,这需求显然不合理.

应用-一个web管理端接收大量客户端上传文件的问题

问题描述 一个web管理端接收大量客户端上传文件的问题 应用场景:一个Java实现的web管理端,对应多个客户端(C++实现,客户端大约有2万台),在管理端通过设置关键字抓取客户端的命中文件,如在管理端设定"你好"关键字下发到各客户端,各客户端会自动搜索本机器上带"你好"关键字的各种类型的文件并将命中文件上报到管理,现在想问的是在管理端如何接收个客户端上传的文件,通过HTTP方式接收还是FTP方式接收,由于客户端数目较多,且可能由于关键字设置过于普通(如"