2016-03-04 61 views
2

閱讀scary doc,我知道如果我提供了危險的SetInnerHTML()的錯誤參數,我的褲子因爲XSS而關閉。我必須在這個函數調用的上游做些什麼來確保我可以安全地使用它?尋找並剝離<腳本>來自用戶輸入的標籤?還有什麼?什麼時候可以考慮使用危險的SetInnerHTML()安全?

+0

html在哪裏起源? – demux

+0

規則的拇指,如果可能避免使用dangerouslySetInnerHTML()。尋找其他的選擇。 – Mox

+0

一個很好的例子和用例是[linkify-string](http://soapbox.github.io/linkifyjs/docs/linkify-string.html)的結果。它包含HTML但可以安全使用,因爲它會轉義HTML輸入並處理鏈接。 – Prinzhorn

回答

3

CAVEAT:我不是安全專家;以下總結了我作爲一名外行人所積累的最佳理解。

確保您的「危險的」內部HTML是安全的最好方法是確保您只將其設置爲您自己生成的HTML。換句話說,您絕不會顯示任何來自外部來源的內容。這可能聽起來太嚴格了,但有一個解決方法:如果你想在你的危險的HTML中包含「受感染」的內容,你可以解析受感染的內容並重新生成它。基本思想是你的解析器只能識別合法的輸入,而忽略其他的一切。然後它接受解析的輸入,並生成安全輸出。

例如,假設我們有以下規則:

  • 字符串是包括AZ,az,0-9的任何序列,和/或標點符號句號,逗號,分號,冒號問題標記和感嘆號。
  • 樣式化的字符串類似[b]粗體[/ b],[u]下劃線[/ u]等。
  • 其他所有內容都被忽略。

請注意,您並未列入黑名單,如腳本標記,因爲您可能不知道需要列入黑名單的所有內容。相反,您將某些您知道安全的特定事物列入白名單,並忽略其他所有內容。一旦完成了對輸入的解析,就得到了已知安全字符串和樣式化字符串的列表,並且使用嵌入式標籤生成安全HTML輸出相對比較簡單。

鏈接和圖像標記更難以安全地處理,因爲任何鏈接/圖像可能會導致惡意軟件,或到一天左右後重定向到惡意軟件的一個看似平淡無奇的網站。我知道用圖像保護圖像的最佳方式是要求將圖像上傳到裝有病毒掃描程序的服務器(它們不是百分之百安全的)。對於鏈接,我能想到的最佳方法是確保實際鏈接文本與您正在鏈接的文本一起顯示。但我仍然會使用相同的方法:編寫一個解析器,該解析器知道如何解析安全的URL(用於鏈接或圖像),並且不知道如何解析不安全的URL,然後從解析的數據重新生成鏈接/圖像。這仍然比僅僅顯示樣式文本風險大得多,但如果你需要鏈接/圖像,這是我所知道的最好的方式。

相關問題