通过IHttpHandlerFactory过滤特殊字符,可以做到和具体项目无关,部署起来也挺简单。
Common.InputText的代码为:
项目中的web.config文件加上这句话:
代码其实挺好理解,就是在提交数据的时候(requestType=="POST"),通过PageHandlerFactory找到页面实例,将过滤字符串的方法(FilterStrFactoryHandler_PreLoad)加到Page实例的PreLoad事件上,使用这个方法有一个前提,就是Input和Textarea控件必须作为服务器控件运行,如果不这样做的话,就不能通过页面实例的FindControl方法找到相应的控件。
using System; using System.Web.UI; using System.Web; using System.Text.RegularExpressions; using System.Collections.Specialized; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace JianCaiWeb.Utils { public class FilterStrFactoryHandler : IHttpHandlerFactory { public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) { //得到编译实例(通过反射) PageHandlerFactory factory = (PageHandlerFactory) Activator.CreateInstance(typeof(PageHandlerFactory), true); IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated); //过滤字符串 if (requestType == "POST") { Page page = handler as Page; if (page != null) page.PreLoad += new EventHandler(FilterStrFactoryHandler_PreLoad); } //返回 return handler; } //过滤TextBox、Input和Textarea中的特殊字符 void FilterStrFactoryHandler_PreLoad(object sender, EventArgs e) { try { Page page = sender as Page; NameValueCollection postData = page.Request.Form; foreach (string postKey in postData) { Control ctl = page.FindControl(postKey); if (ctl as TextBox != null) { ((TextBox) ctl).Text = Common.InputText(((TextBox) ctl).Text); continue; } if (ctl as HtmlInputControl != null) { ((HtmlInputControl) ctl).Value = Common.InputText(((HtmlInputControl) ctl).Value); continue; } if (ctl as HtmlTextArea != null) { ((HtmlTextArea) ctl).Value = Common.InputText(((HtmlTextArea) ctl).Value); continue; } } } catch { } } public virtual void ReleaseHandler(IHttpHandler handler) { } } }
Common.InputText的代码为:
using System.Text.RegularExpressions; public class Common { //字符串过滤 public static string InputText(string text) { text = text.Trim(); if (string.IsNullOrEmpty(text)) return string.Empty; text = Regex.Replace(text, "[//s]{2,}", " "); //two or more spaces text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|//n)*?>)", "/n"); //<br> text = Regex.Replace(text, "(//s*&[n|N][b|B][s|S][p|P];//s*)+", " "); // text = Regex.Replace(text, "<(.|//n)*?>", string.Empty); //any other tags text = text.Replace("'", "''"); return text; } }
项目中的web.config文件加上这句话:
<httpHandlers> <!--过滤提交给服务器的文本信息--> <add verb="*" path="*.aspx" validate="false" type="JianCaiWeb.Utils.FilterStrFactoryHandler, JianCaiWeb.Utils"/> </httpHandlers>
代码其实挺好理解,就是在提交数据的时候(requestType=="POST"),通过PageHandlerFactory找到页面实例,将过滤字符串的方法(FilterStrFactoryHandler_PreLoad)加到Page实例的PreLoad事件上,使用这个方法有一个前提,就是Input和Textarea控件必须作为服务器控件运行,如果不这样做的话,就不能通过页面实例的FindControl方法找到相应的控件。