網路應用程式安全指南/XML 和內部資料轉義
外觀
在內部資料表示中也需要轉義。例如,XML 中錯誤轉義的字串可能允許攻擊者關閉其包含標籤並注入任意 XML。
XML 是一種非常複雜的格式,可能會帶來許多令人不快的意外。
為了防止這種型別的攻擊
- 如果可能,避免使用 XML。
- 對於 XML,請使用經過良好測試的高質量庫,並密切關注文件。瞭解您的庫 - 一些庫具有允許您在不知情的情況下繞過轉義的功能。
- 如果您解析 (讀取) XML,請確保您的解析器不會嘗試載入外部引用(例如實體和 DTD)。
- 對於資料的其他內部表示,請確保應用了正確的轉義或過濾。如果可能,嘗試使用經過良好測試的高質量庫,即使這似乎更困難。
- 如果手動進行轉義,請確保它以安全的方式處理空位元組、意外字元集、無效 UTF-8 字元等。
基本原理
XML 是一種非常複雜的格式,具有許多令人驚訝的功能 - 您知道 XML 可以透過 HTTP 載入其他內容嗎?如果您只是想儲存/傳遞一些結構化值,XML 的強大功能通常是不必要的。JSON 是一種不太複雜的替代方案,但 需要其自身的安全措施(例如避免頂層陣列和十六進位制編碼可能被損壞的瀏覽器解釋的特殊字元)。
XML 太複雜,無法“快速”編寫程式碼來正確安全地處理所有可能性。不要依賴“自制”最小庫的安全性。即使一些“官方”XML 庫也被發現存在一些函式中的轉義問題,或者明確允許將內容傳遞到 XML 中而不進行轉義。(值得注意的是,PHP 的 SimpleXML 中的 addChild 方法執行部分轉義,請參閱 PHP 錯誤 36795 的註釋)庫也可能包含嚴重問題。仔細閱讀庫的文件,並考慮在網際網路上搜索已知問題。如果您不確定,至少快速測試一些基本情況。
XML 具有允許載入外部資料(如實體和 DTD)的功能。一些解析器預設情況下啟用此功能。如果您解析不可信的 XML 檔案(請記住,來自使用者的任何內容都是不可信的),這可能會被用來讀取本地檔案,向防火牆外部無法訪問的內部系統發出請求,在某些情況下甚至 執行程式碼。有關詳細資訊,請參閱 OWASP 文章。
手動進行轉義非常難以做到正確,因為需要考慮所有有問題的案例(例如部分 UTF8 字元或不同的字元集)。編寫一個能夠正確處理正常輸入的解決方案可能很快且容易,但是編寫一個能夠正確處理任何故意格式錯誤的輸入的解決方案則很困難。