優點:寫一次套用全站;缺點:非法詞仍入庫。適合事後補救不想改原代碼的情況。
public class ResponseFilter : Stream
{
Stream responseStream;
long position;
StringBuilder html = new StringBuilder();
public ResponseFilter(Stream inputStream) { responseStream = inputStream; }
// 必須覆寫的抽象成員:CanRead/CanSeek/CanWrite/Close/Flush/Length/Position/Seek/SetLength/Read
// 略...
public override void Write(byte[] buffer, int offset, int count)
{
string sBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
// 非法詞列表可從 DB 或 Web.Config 讀取
string pattern = @"(非法詞彙1|非法詞彙2|非法詞彙3)";
foreach (string w in pattern.Split(new[]{"|"}, StringSplitOptions.RemoveEmptyEntries))
sBuffer = sBuffer.Replace(w, "**");
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(sBuffer);
responseStream.Write(data, 0, data.Length);
}
}
public void Application_BeginRequest()
{
Response.Filter = new ResponseFilter(Response.Filter);
}
所有輸出經過 Write 替換非法詞後再寫入原始回應流,全站自動生效。