熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET設計控件淨化網站語言

2013-11-13 12:21:44  來源: .NET編程 

  概述

  考慮一下這種情形你為一個Web網站寫了一個應用程序它的功能是接受用戶的輸入並將輸入內容永久保存例如保存到數據庫另外還要在網站上顯示出用戶輸入的內容例如論壇就是一個很典型的例子

  如果用戶來源很雜必須考慮如何防止用戶提交和張貼攻擊性(或者色情的庸俗的)的內容可能的解決方案包括

  ⑴ 將用戶群限制到一個封閉的用戶團體即要求用戶使用程序功能之前必須先注冊/登錄這樣由於每次提交的內容都可以追查到提交者用戶破壞網站規則的可能性就小了很多如果有用戶做出了不應該做的事你就可以核實用戶身份予以相應的處理

  ⑵ 在網站上發布用戶提交的內容之前先由管理員審閱很多時候由於人力資源有限這個辦法不一定行得通

  ⑶ 禁止用戶提交攻擊性內容這是最理想的解決辦法把問題解決在起源但具體應該怎麼實現呢?

  本文介紹的方案以一個復合控件為基礎利用一個XML文件來定義攻擊性詞語我們將用VBNET編寫這個復合控件用普通的文本編輯器和命令行編譯器(vbc)完成整個工程的構建

  在正式編寫控件之前首先我們來簡單地回顧一下ASPNET中控件的概念本文出現的所有控件都是服務器控件它們在服務器上運行將HTML代碼發送到客戶端要理解控件的分類可以從控件是否嵌入到Web表單頁面(因而采用按需編譯方式)或預先編譯的角度來觀察微軟定義了下列ASPNET服務器控件HTML服務器控件Web服務器控件驗證控件用戶控件

  前三種控件讀者應該已經比較熟悉了對於開發者來說它們是最簡單的控件類型在ASPNET中已經由微軟為我們編寫好用戶控件則有所不同用戶控件是包裝ascx頁面形式的aspx頁面其他aspx頁面可以通過注冊和實例化來調用用戶控件的功能這是一種被寄予厚望的服務器端控件對於ASP/ASPNET開發者來說它代表著一大進步特別地現在編寫控件的語言已經全面支持面向對象技術

  ASPNET用戶控件由一個或多個服務器控件靜態HTML元素構成可以包含額外的代碼每個用戶控件封裝一組特定的功能用戶控件可以通過簡單地擴展現有服務器控件(控件組)得到例如帶有旋轉功能的圖形控件在文本框中保存日期的日歷控件

  開發復合控件

  控件要檢查用戶提交的內容是否包含攻擊性詞語攻擊性詞語由一個XML文件定義XML文件的結構如下

<?xml version=? encoding=GB
<words>
<word>詞語一</word>
<word>詞語二</word>
</words>

  本文的復合控件(Composite)包含三個ASPNET服務器控件一個Textbox控件一個Label控件還有一個Button控件當用戶點擊Button控件Composite檢查用戶提交的文本是否包含了XML文件中指定的詞語(XML文件的默認名字是bad_wordsxml通過一個自定義屬性定義)並拋出一個自定義事件另外Composite控件還將它的Label子控件的一個Text屬性顯露成頂級屬性

  復合控件可以有選擇地將子控件顯露成屬性或者有選擇地將子控件的屬性和事件作為頂級屬性和事件顯露出來當復合控件整合來自子控件的屬性時它通常只是簡單地委托子控件執行操作如下面的例子所示

// 將操作委托給標簽對象標簽對象是一個
// SystemWebUIWebControlsLabel的實例
Public Property Text() As String
Get
EnsureChildControls()
Return labelText
End Get
Set
EnsureChildControls()
labelText = value
End Set
End Property

  我們需要一個文本輸入框讓用戶輸入內容一個按鈕來提交表單還要一個向用戶反饋信息的文本標簽下面我們來看看Web表單的代碼復合控件就是在這裡實例化的

【compositeaspx】

<%@ page language=vb debug=false trace=false %>
<%@ Register TagPrefix=Custom Namespace=CustomControls Assembly = CustomControls %>
<html>
<script language=VB runat=server>
Private Sub CheckText(sender As Object e As CheckEventArgs)
If eMatch = false Then
CompositeText = <h>發布內容請遵守本站規則!不得發布攻擊性言辭!</h
Else
CompositeText = 你提交的內容已通過檢查!
End If
End Sub
</script>

<body>

<h>語言淨化控件實例</h><br>
<form runat=server>
<Custom:Composite id = Composite OnCheck = CheckText
filename = bad_wordsxml runat = server/></form></body>
</html> 

  上面的代碼首先注冊指定的復合控件我們將把控件的代碼編譯成一個dll文件放入應用的bin目錄這是ASPNET首先搜索的位置在Web表單構成的用戶界面中我們實例化了自定義控件同時指定了

  ⑴ 當控件拋出OnCheck事件執行一個本地的子過程CheckText我們把復合控件的標簽的文本通過一個公用屬性顯露出來標簽的內容由OnCheck事件句柄設置的另一個公用屬性決定

  ⑵ 定義攻擊性詞語的XML文件的名字

  ⑶ 另外我們還定義了一個由復合控件調用的CheckText子過程

  現在來看復合控件本身復合控件有兩個類用兩個獨立的VB源文件實現分別是compositevb和checkeventvb

【compositevb】

Imports System
Imports SystemWeb
Imports SystemWebUI
Imports SystemWebUIWebControls
Imports SystemXml
Imports SystemCollections

Namespace CustomControls
Public Class Composite
Inherits Control
Implements INamingContainer
Private _filename As String = bad_wordsxml
Private label As Label
Private box As TextBox

Public Property filename() As String
Get
Return _filename
End Get
Set
_filename = value
End Set
End Property

以用戶提交的文本內容為輸入參數如果用戶提交的內容包含攻擊性言辭
則返回修改後的版本
否則直接返回原始的文本
Public Function CheckString(InputString as String) as string
Dim alWordList As new ArrayList
dim xmlDocPath as string = mappathsecure(bad_wordsxml)
dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath)
dim element as string
dim output as string
dim asterisks as string = *************************

將定義攻擊性言辭的xml文件內容讀入到一個ArrayList
while (xmlReaderRead())
if xmlReaderNodeType=xmlNodeTypeText then
alWordListAdd(xmlReaderValue)
end if
end while
xmlReaderClose()

檢查用戶提交的文本內容將攻擊性言辭替換為適當數量的星號
For Each element in alWordList
InputString=InputStringReplace(element
asteriskssubstring( (elementlength)))
Next

Return InputString

End Function

Public Property Text() As String
Get
該方法首先檢查ChildControlsCreated屬性的當前值如果該值是false
則調用CreateChildControls方法
EnsureChildControls()
Return labelText
End Get
Set
EnsureChildControls()
labelText = value
End Set
End Property

Public Event Check As CheckEventHandler

Protected Overridable Sub OnCheck(ce As CheckEventArgs)
RaiseEvent Check(Me ce)
End Sub

創建Composite控件的子控件
Protected Overrides Sub CreateChildControls()

ControlsAdd(New LiteralControl(<h>請在下面輸入文字內容: ))

文本輸入框
Dim box As New Textbox()
boxText =
ControlsAdd(box)

ControlsAdd(New LiteralControl(</h))

按鈕
Dim button As New Button()
buttonText = 提交
ControlsAdd(New LiteralControl(<br>))
ControlsAdd(button)

將一個事件句柄加入新創建的按鈕對象
AddHandler buttonClick AddressOf MeButtonClicked

ControlsAdd(New LiteralControl(<br><br>))
label = New Label()
labelHeight = UnitPixel()
labelWidth = UnitPixel()
labelText =
ControlsAdd(label)
End Sub

Protected Overrides Sub OnPreRender(e As EventArgs)
CType(Controls() TextBox)Text =
End Sub

Private Sub ButtonClicked(sender As [Object] e As EventArgs)
OnCheck(New CheckEventArgs(CType(Controls() TextBox)Text
CheckString(CType(Controls() TextBox)Text)))
End Sub
End Class
End Namespace

  上面代碼的主要任務是

  ⑴ 首先導入必要的名稱空間聲明當前類所屬的名稱空間

  ⑵ 接下來定義Composite的主體Composite從最基本的Control類繼承另外還要實現INamingContainer接口INamingContainer接口允許Composite控件將事件轉發到它的Button子控件

  ⑶ 用CreateChildControls方法(而不是OnInit或構造函數)創建子控件

  ⑷ Composite控件沒有顯露出Button子控件的Click事件相反它處理了Click事件並拋出自定義事件Check

  ⑸ Composite控件顯露了下列公用屬性Text即Label子控件的Text屬性值FileName允許獲取和設置定義攻擊性詞語的XML文件的名字

  ⑹ 主要的檢查功能由CheckString方法實現它的輸入參數是一個文本字符串CheckString方法從XML文件讀取禁用的詞語放入一個數組列表(ArrayList)然後檢查指定的字符串是否包含禁用的詞語所有攻擊性的詞語將被適當數量的*替代

  ⑺ OnPreRender清除文本框子控件的文本

  ⑻ 當用戶點擊按鈕ButtonClicked開始執行ButtonClicked調用onCheck子過程傳入適當的參數(一個新建的CheckEventArgs對象創建CheckEventArgs對象的參數是檢查前和檢查後的文本)OnCheck隨後觸發一個事件該事件將由aspx頁面中的代碼處理

【CheckEventvb】

包含定制事件數據類CheckEventArgs的代碼
另外還定義了Check事件的事件句柄
Imports System
Namespace CustomControls
Public Class CheckEventArgs
Inherits EventArgs
Private _match As Boolean = False

Public Sub New(string As String string as String)
If string=string Then
_match = True
End If
End Sub

Public ReadOnly Property Match() As Boolean
Get
Return _match
End Get
End Property
End Class

Public Delegate Sub CheckEventHandler(sender As Object ce As CheckEventArgs)
End Namespace

  CheckEventArgs的構造函數是兩個字符串根據字符串的值設置相應的匹配標記_match另外上面的代碼還定義了CheckEventHandler事件句柄

  編寫好上面的代碼後如果你沒有安裝IDE用下面的命令執行編譯即可

vbc /t:library /out:/bin/CustomControlsdll /r:Systemdll /r:Systemwebdll
/r:Systemdrawingdll /r:SystemDatadll /r:Systemxmldll *vb 


From:http://tw.wingwit.com/Article/program/net/201311/15751.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.