2013-02-11 47 views
3

與任何用戶提供的數據一樣,這些URL需要進行轉義和適當過濾以避免各種漏洞利用。我希望能夠如何安全地將用戶提供的URL添加到我的HTML頁面?

  • 放置用戶提供的網址,在href屬性。 (獎勵積分,如果,如果我忘了寫引號我沒有得到擰)

    <a href="ESCAPED_USER_URL_GOES_HERE">...</a> 
    
  • 禁止惡意URL如javascript:東西或鏈接到邪惡的域名。

  • 爲用戶提供一些迴旋餘地。我不想因爲忘記添加http://或類似的東西而引發錯誤。

不幸的是,我無法找到任何「規範」解決這類問題。我唯一能找到靈感的地方是來自Javascript的encodeURI函數,但這對我的第二點沒有幫助,因爲它只是做一個簡單的URL參數編碼,但只留下特殊字符,如:/

+0

什麼是「邪惡的域名」?如何將任何?代碼邏輯可以告訴一個邪惡和良好之一,也是......你說你想要把用戶提供的URL之間的差異,但禁止「三通」是什麼意思,甚至 – eis 2013-02-11 07:05:15

+0

@eis:我對於濫用,這種說法含糊不清,例如,「邪惡」可能會有一些來自黑名單的東西。重要的是我希望能夠分析URL(例如,使用encodeURI不會這樣做)。至於「鏈接」部分,那只是一個錯字。 – hugomg 2013-02-11 13:36:02

回答

0

對於第一點,定期屬性編碼工作得很好。 (轉義字符轉換爲HTML實體,轉義引號,如果屬性保證爲引號,則和號和括號是可以的;轉義其他字母數字字符會使屬性安全,如果它的意外不加引號。你想做什麼。只記得用白名單的方式,而不是一個黑名單的一個其可以使用HTML實體編碼和其他技巧來解決最簡單的黑名單。

3

OWASP提供了一個regular expressions for validating user input的列表,其中一個用於驗證URL。這與您將要達到語言中立,規範的解決方案一樣緊密。

更有可能您會依賴正在使用的編程語言的URL解析庫。或者,使用URL parsing regex

的工作流程是這樣的:

  1. 驗證所提供的字符串是一個結構良好的URL。
  2. 當沒有指定協議時,提供默認協議,如http:
  3. 保持可接受的協議的白名單(http:https:ftp:mailto:等)
    1. 白名單將是應用特定的。對於地址簿應用程序,mailto:協議將是不可或缺的。很難想象javascript:data:協議的用例。
  4. 執行maximum URL length - 確保跨瀏覽器URL並防止攻擊者以兆字節長度的字符串污染頁面。幸運的是,你的URL解析庫會爲你做到這一點。
  5. 編碼用法上下文的URL字符串。 (轉義爲HTML輸出,轉義以用於SQL查詢等)。

禁止惡意URL如javascript:東西或鏈接,或邪惡的域名。

可以利用Google Safe Browsing API檢查間諜軟件,垃圾郵件或其他「惡」的域。

+0

還要注意驗證始終是一種妥協。例如,在OWASP網站上爲URL提供的正則表達式接受'http:// google'作爲有效的url,但不接受'www.google.com'或'http://www.hän.fi/'( [IDNA](http://en.wikipedia.org/wiki/Internationalized_domain_name))。它也接受'http:// user:pass @ domain.com',這可能不是你想要的。 – eis 2013-02-11 09:56:25

相關問題