2010-02-26 28 views
0

我有一個安全相關的問題。我的Web應用程序允許用戶輸入URL。該URL會立即存儲在數據庫中(此時不進行修改,這是錯誤的嗎?)。我使用Linq到SQL,因此它已經被參數化。將超鏈接顯示回用戶時,我正在使用中繼器。我是否需要編碼超鏈接文本以及工具提示和href屬性?或者,我只需要編碼文本(顯示)。另外,我假設URL編碼是我需要的,但是我也必須使用HTML編碼嗎?編碼超鏈接 - 何時以及如何?

我試着Server.UrlEncode在文本是<script> alert("hello") </script>的所有三個屬性,它似乎搞亂了href和文本。我猜這意味着它不完全安全?

編輯 - 如果我在輸出上編碼,我應該補充一點,如何使其顯示爲「/」而不是「%2」? 謝謝

回答

3

你允許任意的http(s)鏈接/文本?

文本(anchor標籤的innerHtml)必須是htmlentity編碼的。至於在輸入,至少檢查輸入url是真正的http或https鏈接,只有在主機名和路徑中有效的字符(使用RFC,但隨意限制進一步;注意punycode是用於非ascii域名,所以chars白名單很短)。這將阻止javascript:url,用戶名:password @ hostname用於網絡釣魚,ftp://,kindle://和其他方案,在url中使用\(通過IE轉換爲/但可能會混淆你對域的讀取) ,使用過多的空白空間www.good%20 {N times} evil.com網址等

如果允許參數,urlencode個別名稱和值儘管它們影響目標(也不要HTML實體編碼) 。 Strip#以及之後的任何內容,無論如何都不會發送到目標。將href用雙引號括起來。

如果適用,在用戶離開您的網站時警告用戶可能是個好主意。請注意,目標網站會將網頁網址作爲引薦來源。其他選項是隻允許鏈接到已列入白名單的域名,而您知道這些域名不會造成危害(除負責任地行爲外,這會阻止您的網站被netcraft,google等鏈接到有害網站)。

+0

感謝您的回覆。鏈接將顯示在用戶的配置文件區域中。例如,他們的個人資料顯示「主頁」。當其他用戶訪問該用戶的個人資料時,他們可以看到該鏈接。因此,我無法真正檢查鏈接的標題,但希望確保它們不會對我的網站用戶實際訪問鏈接的用戶造成問題。 – Skoder 2010-02-26 15:11:28

1

這是錯誤的嗎?是根據輸入進行消毒,而不是輸出。

如果您在保存到db之前進行清理,輸出時無需編碼。經驗法則:在所有圖層或應用程序中信任您的數據,從而儘早進行消毒。

+0

我按照'http:// msdn.microsoft.com/en-us/library/bb355989.aspx'的建議 - 它說'避免錯誤的編碼數據提前。請確保您在數據顯示給客戶端之前儘可能地編碼。 – Skoder 2010-02-26 02:02:54

1

你應該立即清理輸入(這與逃跑不同)。這意味着執行某種驗證,即數據是URL,或者至少只包含URL允許的字符。使用正則表達式來做到這一點,或URL解析庫(對不起,我不太熟悉.NET的API)。

你應該在輸出上進行編碼,除非你想用它作爲HTML元素中的URL(你這樣做!),在這種情況下你不應該做任何編碼。您一定需要對工具提示和鏈接標記正文中的文本進行編碼。我會特別想想如何在輸入數據庫之前清理輸入。我建議瀏覽這個fantastic resource of example XSS攻擊。

在輸出上進行編碼而不是在保存到數據庫時進行編碼的原因是每個輸出介質可能有不同的編碼/轉義規則。例如HTML與JavaScript不同,它與PDF或Flash或CSS等不同。

此外,我還假設您在保存到數據庫時使用預準備語句,以避免SQL注入?

+0

謝謝。我將檢查使用我得到的正則表達式輸入的URL。如果我對文本進行編碼,它會顯示爲'%2'而不是'/'。我將如何克服這一點?例如,當我發佈到論壇時,URL被維護。這是否意味着它們不會將輸出編碼爲假定輸入有效? – Skoder 2010-02-26 14:19:27

+1

正確,它們不會在輸出上編碼,因爲URL已經是A標籤的href屬性所需的格式。現在,如果他們想要將URL顯示爲鏈接文本,那麼你可以對其進行編碼,例如, encoded_url 希望更有意義。 – Mike 2010-02-26 15:04:23

+0

感謝邁克,這很有道理。 – Skoder 2010-02-26 15:13:47

相關問題