程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 一個較完整的關鍵字過濾解決方案(上)

一個較完整的關鍵字過濾解決方案(上)

編輯:關於ASP.NET

如果您希望看到關鍵字過濾算法的話那麼可能就要失望了。博客園中已經有不少關於此類 算法的文章(例如這裡和這裡),雖然可能無法直接滿足特定需求,但是已經足夠作為參考 使用。而本文的目的,是給出一個較為完整的關鍵字過濾功能,也就是將用戶輸入中的敏感 字符進行替換——這兩者有什麼區別?那麼就請繼續看下去吧。:) 有趣的需求

關鍵字過濾功能自然無比重要,但是如果要在代碼中對每個輸入進行檢查和替換則會是一 件非常費神費事的事情。尤其是如果網站已經有了一定規模,用戶輸入功能已經遍及各處, 而急需對所有輸入進行關鍵字過濾時,上述做法更可謂“遠水解不了近渴”。這時候,如果 有一個通用的辦法,呼得一下為整站的輸入加上了一道屏障,那該是一件多麼惬意的事情。 這就是本文希望解決的問題。是不是很簡單?我一開始也這麼認為,不過事實上並非那麼一 帆風順,而且在某些特定條件下似乎更是沒有太好的解決方法……

您慢坐,且聽我慢慢道來……

實現似乎很簡單

數據結構中的單向鏈表可謂無比經典。有人說:單向鏈表的題目好難啊,沒法逆序查找, 很多東西都不容易做。有人卻說:單向鏈表既然只能向一個方向遍歷,那麼變化就會很有限 ,所以題目不會過於復雜。老趙覺得後者的說法不無道理。例如在現在的問題上,我們如果 要在一個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);
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved