2013-04-16 29 views
3

考慮到我分析用戶的輸入,這應該是電子郵件地址,到MailAdress類:是否可以通過MailAddress類實現XSS?

var mailString = Request.QueryString["mail"]; 
var mail = new MailAddress(mailString); 

是否有可能離開了跨站點腳本攻擊,如果我輸出的MailAddress對象後以任何方式?例如通過一個的WebForms文字控制:

litMessage.Text = "Your mail address is " + mail.Address; 

是否有必要消毒outpout儘管我確信該地址是通過解析字符串有效的電子郵件地址?

從我能收集的郵件地址的RFC是非常複雜的,所以我不確定跨站點腳本是否可以隱藏在.NET認爲有效的郵件地址中。

編輯:
MSDN><支架被允許在電子郵件地址:

地址參數可以包含一個顯示名稱和相關的電子郵件地址,如果您附上地址在尖括號中。例如:「湯姆·史密斯<[email protected]>」

所以問題仍然存在,如果這是不夠的XSS攻擊和/或如果MailMessage類做任何事情來逃避危險的部分。

回答

0

一般而言,您不需要稍後驗證輸出。不過,我總是建議您這樣做,原因如下:

  1. 在您的應用程序中可能存在一處洞,無法正確驗證輸入。這可能會被攻擊者發現並用於XSS。當許多不同的開發人員在開發應用程序時,這是特別有可能的。
  2. 在執行/更新輸入上的過濾器之前,數據庫中可能存在舊數據。這可能包含可用於XSS的惡意代碼。
  3. 攻擊者非常聰明,通常可以找出擊敗過濾器的方法。微軟在防止這一問題上提出了很多關注,但它永遠不會完美。如果攻擊者面對和傳出過濾器以及傳入過濾器,它會使攻擊者的工作變得更加困難。

我知道這是一個不斷過濾的痛苦,但這樣做有很多價值。深度防禦戰略在當今世界是必不可少的。

編輯:

對不起,我沒有真正回答你的問題的第二部分。根據文檔,我沒有得到這樣的印象,就是API的核心是驗證有效的格式化,而且重點在於消毒。因此,我不知道爲了安全目的而依靠它是安全的。

但是,編寫自己的消毒劑並不難,如果發現缺陷,您可以立即更新。首先通過一個良好的RegEx過濾器(請參閱:Regex Email validation),然後遞歸地運行該地址刪除電子郵件地址中的每個非有效字符(這些不應該在此處通過,但要全面執行此操作,並且如果要重用在其他地方上課),然後用HTML含義逃避每個角色。我強調過濾的遞歸應用,因爲攻擊者可以利用非遞歸濾波用這樣的東西:

<scr<script>ipt>

注意,非遞歸濾波將消除<script>中間發生和離開外發生完整。

+0

如果MailAddress類已經確保只接受有效的字符串,那麼使用額外的正則表達式過濾器有什麼意義?我的問題是,如果有效的電子郵件地址可能包含可能以這種方式通過驗證的XSS攻擊。當然,當你說在創建輸出時逃避html字符絕對不是一個壞主意。不過,我想知道如果使用'MailMessage'對象,這種攻擊甚至是可能的。從頭到尾知道可能的攻擊者可能擁有哪些選項。 – magnattic

+0

您在使用MailAddress類時不需要添加正則表達式過濾器。我把它包括在這裏是爲了開發一種消毒劑的完整性。然而,在高度安全的環境中,我們不喜歡信任專有/關閉源代碼,因爲我們無法檢查它是否存在漏洞。出於這個原因,我們寫我們自己的。至於通過MailMessage獲得攻擊,我不知道那裏有任何攻擊,但這並不意味着這是不可能的,特別是如果你以一種作者沒有預料到的方式使用這個類。 –

+0

如果有人攻擊了'MailAddress',他們可能不會放棄它,因爲它在地下值得*很多錢。我剛剛聽說Java 7的黑客以50,000美元的價格出售。一旦被披露,他們就毫無價值。 –

0

是否有必要消毒outpout

你不 '的sanitize' 的輸出,你編碼。您輸出到HTML文檔中的每個字符串都需要進行HTML編碼,因此如果郵件地址中存在<字符,則無關緊要 - 因此您會在HTML源文件中獲得&lt;,並且該字符串將顯示正確作爲頁面上的文字<

許多ASP.NET控件會自動爲您處理HTML轉義,但Literal不會默認使用,因爲它可用於顯示標記。但是,如果您將Literal控件的Mode屬性設置爲Encode,那麼像您所做的那樣設置Text完全沒問題。

無論您是否認爲您使用的值能夠包含<字符,您應該確保每次將內容放入HTML頁面時都始終使用安全的HTML編碼輸出。這是一個關注點分離問題:HTML輸出代碼知道所有關於HTML格式的信息,但它不應該知道任何關於電子郵件地址或其他應用程序字段中的哪些字符是可以使用的。

留下了逃跑,因爲你覺得值是「安全」的介紹了輸出級和輸入級之間的隱式和脆弱的耦合,因此很難驗證代碼是安全的,並容易使不安全,當你做出改變。

相關問題