如果您正確清理和處理輸入,則可以安全地允許src屬性。爲此,您應該首先通過有效的URL字符白名單canonicalize it對其進行清理,然後驗證它是否指向有效的圖像。
你提到的白名單是第一步(也是重要的一步)。要實施白名單,只需刪除對URL無效的每個字符。同時驗證URL是否正確形成,這意味着它指向用戶應該能夠訪問的有效資源。例如,用戶不應該通過傳入file://sensitive.txt
或其他東西來訪問服務器上的本地文件。如果http或https是唯一需要使用的協議,請檢查URL是否以這些開頭。如果你是額外的偏執狂,你可能完全拒絕這個請求,因爲它顯然已被篡改。白名單很重要,但單獨列入白名單將會保持該功能的安全。
規範化是重要的,因爲許多攻擊依賴於提交的URL,最終帶你到某個地點,但不得濫用計算機的先天缺乏推理得到的東西它不應該。這也有助於消除重複路徑到相同的資源,這可能會提高性能(或者至少允許您通過不重新檢查自上次檢查以來未更改的已知文件來提高性能。有可能欺騙最後修改的日期,以便攻擊者可以在已經「檢查並信任」它之後交換惡意文件)。
要驗證您是否指向有效圖像,請打開文件並在前幾個字節中讀取。 不是只是簡單地信任文件擴展名,但在打開文件(爲了性能和安全性)之前請先檢查它。每種圖像格式都有一定的字節模式,您可以檢查。一個很好的look at first is JPEG。它可能仍然是可能的惡意用戶把shellcode的或其他攻擊代碼在 包含正確的頭文件中的圖像文件,但它更困難的事。這將是一個性能瓶頸,所以如果你實施這個計劃,那麼就應該做出適當的計劃。
你可以分析每一個輸入或也許URL編碼的URL。但我不確定這是否會阻止XSS。 – rekire 2013-03-07 20:58:16