2016-08-22 90 views
0

防止儲存XSS的最佳方法是什麼?XSS預防:客戶端還是服務器端?

第一種解決方案的問題是數據可能會被修改(字符編碼,部分或全部刪除...)。這可以改變應用程序的行爲,尤其是對於顯示問題。

+0

安全性在層中最好,所以兩者都是最好的,然後是最好的。順便說一句,這比基於編程的安全性更強,https://security.stackexchange.com可能更適合它。 –

回答

3

您應用禁制當且僅當您的數據需要符合特定格式/標準,你肯定你可以安全地丟棄數據;例如您從電話或信用卡號碼中刪除所有非數字字符。您總是使用爲適當的上下文應用轉義,例如,將用戶提供的數據放入HTML時對其進行HTML編碼。

大多數時候你不想清理,因爲你想明確地允許自由形式的數據輸入和禁止某些字符,這是毫無意義的。我在這裏看到的少數幾個例外之一是,如果您接受來自用戶的HTML輸入,則需要清理HTML以過濾不需要的標記和屬性,並確保語法有效;但是,您可能希望將未經處理的原始版本存儲在數據庫中,並僅在輸出中應用此限制。

+0

它應該是「除非你想允許自由形式的數據輸入,否則大多數時候你都想要消毒,所以應該總是應用消毒。 – Andy

0

安全的黃金標準是:驗證您的輸入,並編碼,而不是消毒您的輸出。

首先驗證輸入服務器端。一個很好的例子就是用戶配置文件中的電話號碼字段。電話號碼應該只包含數字,破折號,也許還有一個+。那麼爲什麼讓用戶提交字母,特殊字符等呢?它只會增加攻擊面。因此,儘可能嚴格驗證該字段,並拒絕錯誤的輸入。

其次,根據輸出上下文對輸出進行編碼。我建議在服務器端做這個步驟,但只要您使用的是經過良好測試的良好前端框架,在客戶端執行相對安全。衛生處理的主要問題是不同的環境對安全有不同的要求。要在將用戶數據注入到HTML屬性中時直接阻止XSS到頁面或腳本標記中,您需要做不同的事情。因此,您可以根據輸出上下文創建特定的輸出編碼器。實體編碼用於HTML上下文,用於腳本上下文的JSON.stringify等。