2010-10-15 37 views

回答

2

是的,試試這個:

if(Uri.IsWellFormedUriString(url, UriKind.Absolute) && url.StartsWith("http")) 
    Response.Write(string.Format("<a href=\"{0}\">{0}</a>", 
     HttpUtility.HtmlEncode(url))); 
+0

不幸的是「javascript:alert('hi')」返回true。 – MyItchyChin 2010-10-15 21:25:21

+1

簡單的方案檢查不會消除。我編輯了我的答案。 – 2010-10-15 22:20:21

1

所以事情不是要做;

  1. 使用正則表達式
  2. 使用的HTMLEncode沒有思想。

要做的事情;

  1. 將所有輸入視爲不可信。
  2. 在輸出之前對輸入進行編碼。但是請確保您使用正確的編碼類型。如果你把用戶輸入放在一個屬性中,那麼你使用HtmlAttributeEncode,如果它只是HTML,那麼你使用HtmlEncode,如果你把它放到JavaScript中,那麼它就是JavaScriptEncode。如果你的JavaScript把它放入一個div,那麼它是HtmlEncode,然後是JavaScriptEncode。
  3. 考慮使用AntiXSS,它提供了更多的編碼機制,並使用安全列表方法,這種方法本質上更安全。
  4. 將退出網址列入白名單,以便用戶不能將此頁面用作開放引薦來源網址。沒有一個帶有URL的參數,而是有一個GUID,它從數據庫,會話表或其他任何地方查找URL。

(披露:我自己AntiXSS)

1

最好的辦法是完全刪除頁面,只是接受了一個網站,並使其像一個網站。網站鏈接到其他資源,這就是爲什麼網站有超過2億個網站,而不是一打。

如果失敗了,最好的辦法是先用HtmlEncoding 作爲快速修復,然後將其替換爲帶有一個ID的查找,以便將其帶到不同的站點。

但是,真的,那些「你要離開的ZOMG!」網頁是可怕的。它們比爲每個所謂的「外部」鏈接打開新標籤的網站都要糟糕。

+0

該網頁的目的不是讓人們停留在網站上,而是提供一個普遍的免責聲明,即該網站是作爲信息資源提供的,而不一定是我們支持,認可或附屬的網站。企業只是想保護它的形象和聲譽,因爲它的很多成分都不那麼明亮。不幸的是,這個頁面在我們不知情的情況下由內容管理人員實施和部署,後來才被PCI審計所採用。所以現在我們有成千上萬的資源在使用它,並且我的任務是修復XSS漏洞。 – MyItchyChin 2010-10-18 16:09:42