2009-06-07 61 views
0

當添加用戶輸入到一個網頁,它應該(除非是當然的HTML :)進行編碼,以幫助防止XSS攻擊等。像這樣:添加HTML編碼到業務層

litForename.Text = HttpUtility.HtmlEncode(MyUser.Forename); 

我將一個模板放在一起來生成我的業務邏輯層,並且我正在考慮在數據從數據庫中出來之前立即使用它來完成所有編碼,然後到達UI代碼。這將確保一切都應該是編碼(我顯然排除包含XHTML/Xml字符串的列)。在數據訪問方法的重載將允許數據的檢索,沒有編碼(因此它可以被編輯):

// Get a 'User' entity with all the string fields HTML encoded 
BLL.Users.GetById(int userId) 

// Get a 'User' entity with optional HTML encoding 
BLL.Users.GetById(int userId, bool useHtmlEncoding) 

這是一種辦法,其他任何人使用,或者是一個愚蠢的想法?優缺點都有什麼?

謝謝。

回答

3

可能有邊緣的情況下,這是有道理的,但總的來說,我會建議反對這一點。您的業​​務邏輯層只應處理業務邏輯和業務邏輯。

同樣,您的控制器(假設ASP.NET MVC)應該處理在您的業務領域中有意義的值,而不是在預期特定類型的UI時已經改變的值。

你的UI層是唯一應該知道和關心它是什麼類型的UI的層。目前看來,您唯一的UI類型將基於HTML,但可能會改變。

+0

我同意 - 感謝您的理智檢查。 – Nick 2009-06-07 20:43:57

1

在將數據保存到數據庫中使用HtmlEncode的問題是,您必須在數據中處理諸如&"之類的內容。例如,「Tom O'Brien」將以「Tom O " Brien」的形式保存到數據庫中。做一個SELECT或UPDATE將是棘手。

我認爲只有在UI中使用HtmlEncode來顯示文字,纔會做得更好。

+0

我在考慮只在出路上對數據進行編碼 - 所有進入數據庫的數據都將按原樣存儲。 – Nick 2009-06-07 18:36:34

0

我同意其他海報視圖級數據轉換屬於視圖代。您可能只從基於XML的視圖開始(例如,用於語音瀏覽的XHTML,VoiceXML,用於Web服務的XML),但是當您決定還需要JSON視圖來支持AJAX交互時會發生什麼? JSON Javascript文字使用與XML不同的轉義機制。

您還會遇到這樣的情況:一個邏輯層方法需要調用另一個邏輯層方法來實現與視圖生成無關的目的。也許調用方法需要應用一些批量數據轉換來填充另一個數據庫表。在這種情況下,調用方法必須撤消XML轉義。

1

您的業務邏輯真的不應該知道您的演示文稿。無論您是在提供網絡,Windows還是任何其他類型的用戶界面,您都不應該在業務邏輯中擁有這些細節。

您是否認爲使用業務層的人可能會嘗試在編碼之上再次對數據進行編碼?這可能會導致看起來很雜亂。

0

瞭解PHP的magic_quotes_gpc功能的教訓:這樣的編碼無疑只會讓事情更加混亂,當你不應該時你會逃避,在你應該時忘記逃跑,並且通常是一種痛苦。不要對數據進行編碼,直到將其發送到需要的地方,無論是數據庫,Web還是其他地方。