2

我聽到有人說輸出編碼必須在客戶端完成,而不是在服務器端完成。我的問題是:它不隨上下文而變化嗎?如何在XSS中繞過客戶端編碼

  1. 是否在某些客戶端輸出編碼是夠了, 不能被繞過好的案例?
  2. 如果我使用像encodeURIComponent這樣的客戶端js函數對導致XSS的URL進行編碼,攻擊者如何繞過這個並仍然導致XSS?
  3. 由於XSS,網絡釣魚也可能發生。如果我至少做輸出編碼可以防止網絡釣魚?
+0

你可以提供一些更多的上下文嗎?客戶端XSS編碼現在是什麼? – deceze 2012-02-11 11:43:39

回答

2

簡而言之,XSS編碼需要在數據放入html或javascript的時候發生,無論是服務器端和/或客戶端。我很容易想象將數據放入服務器端的腳本標記開始正確編碼,但是然後客戶端上的JavaScript以不安全的方式使用該值,從而創建了XSS漏洞。因此,當將不可信數據放入網頁(無論是在html標籤中,還是在-tags中,在css等中 - 請參閱OWASP XSS預防備忘單)時,我們需要進行編碼。然後當我們來到客戶端時,我們也需要確保我們的javascript不會引入XSS問題。例如,這可能是基於DOM的XSS,或上面提到的示例。

所以我的回答是,你需要在服務器和客戶端都進行編碼。

我不明白第三個問題是如何相關的。網絡釣魚可能以許多不同的方式發生。在完全不同的領域只是模仿原來的頁面等。

編輯:另外一件事。如果將不可信的數據放入頁面服務器端而不進行編碼,則客戶端很少能解決該問題。很可能已經遲到了。

1

Erlend答案很美。我想分享我關於輸出編碼的發現。

在服務器端完成的輸出編碼在客戶端更好。

您可以從OWASP Xss Prevention

獲得關於輸出編碼更多的知識,你可以做這個客戶端了。如果您要在html上下文中使用不受信任的(用戶給定輸入)數據,請使用javascript的本地api innerText IE Docs(textContent for moz)或將字符(<,>,',「,/,)編碼爲html實體