2010-11-02 59 views
4

我在我的asp.net項目的一些webforms中使用FreeTextBox HTML編輯器。如果我不ValidateRequest屬性設置爲false我得到這個錯誤:如果我將ValidateRequest設置爲false,是不是很危險?

從客戶端檢測到有潛在危險的Request.Form值

它在管理文件夾OK,但因爲只有授權用戶才獲得與它一起工作。但是,像公共頁面一樣,每個用戶都可以留下評論(使用FreeTextBox來收集用戶評論)? XSS攻擊沒有風險嗎?如果答案不是,那麼ValidateRequest屬性是什麼?

回答

6

不,你是對的,這是潛在的危險。它背後的想法是,.net不想限制可以使用它的控件做什麼,但同時消除了許多安全漏洞的可能性。 ValidateRequest屬性就在那裏,所以你可以告訴ASP.NET:「嘿,不要擔心這個,我會自己驗證它,因爲我期望的東西對你來說可能看起來很危險。」

它設置爲驗證默認的響應,因爲沒有驗證潛在的XSS攻擊是很危險的,這是更好地得到您沒有比有你的網站被黑客入侵實現驗證錯誤。

+0

我使用HttpUtility.HtmlEncode(),驗證足夠嗎? – Mostafa 2010-11-02 08:32:04

+0

@Mostafa:使用'HtmlEncode'足以抵禦XSS,但也可能有其他地方需要確保數據編碼正確,例如,如果將其存儲在數據庫中。 – Guffa 2010-11-02 09:05:28

+1

@Mostafa:下載並使用MS AntiXSS Library,其實現與使用Server.HtmlEncode相同,但其用於擦除的charachter庫更大且更好用。 – ewitkows 2010-11-02 20:44:50

3

是的,可以禁用請求驗證。

的請求驗證捕獲在跨站腳本攻擊和類似最常用的字和詞組,但它不能趕上做一個漏洞的無微不至。所以,雖然請求驗證提供了對大多數漏洞的保護,但您從來沒有完全受到它的保護,但您仍然必須將所有輸入視爲潛在的惡意。

請求審定的第一個目的是爲了保護由人誰是無能XSS攻擊和類似的,所以他們也不是完全無保護的內置應用程序。如果您知道如何正確處理輸入,並且設法正確實施,則不需要請求驗證。

+0

作爲一名開發人員,他們始終是「反對某件事」的理由。在一天結束時,你必須記住「縱深防禦」的原則。正如@Guffa所說的,請求驗證有幫助,但那不是全部。 IE8和其他瀏覽器傾向於幫助刪除XSS,但只要您遵循不信任任何輸入的基本模式,那就是最重要的事情。 – ewitkows 2010-11-02 20:47:49

1

看一看ValidateRequest MSDN上。這告訴你輸入被掃描以查找潛在危險的內容。如果你只使用輸入字段等來表示明文,這一切都很好。 一旦你想讓你的用戶提供例如,指向其他頁面的鏈接,或者開始在隱藏的輸入字段中保存額外的數據(例如XML格式)。 ValidateRequest不會容忍這種內容。 ValidateRequest是一種很好的功能,我幾乎總是最終禁用,但禁用它確實意味着您需要對自己的輸入進行一些驗證。在我看來,無論如何你總是應該自己驗證輸入。

1

FreeTexBox控制和

「從客戶端檢測到有潛在危險的Request.Form值」你可以嘗試另一種

if(!this.Page.ClientScript.IsOnSubmitStatementRegistered("Replace")) 
{ 
string script = @"if (Page_IsValid){FTB_API['" + txtBox.ClientID + @"'].initialized=false; FTB_API['" + txtBox.ClientID + @"'].htmlEditor.value=FTB_FreeTextBox.prototype.HtmlEncode(FTB_API['" + txtBox.ClientID + @"'].htmlEditor.value);}"; 
this.Page.ClientScript.RegisterOnSubmitStatement(this.Page.GetType(), "Replace", script); 
} 

決定,不要忘了替換的符號,當您從發送字符串服務器到客戶端應用程序

if(!String.IsNullOrEmpty(yourstring)) txtBox.Text= yourstring.Replace("&gt;", ">").Replace("&lt;", "<").Replace("&amp;", "&").Replace("&quot;", ('"').ToString()).Replace("&#146;", "'"); 

在這種情況下,您不需要關閉ValidateRequest。在保存數據庫中的字符串之前,您還可以替換字符。

相關問題