跨站腳本攻擊(XSS)
XSS(跨站腳本攻擊,Cross-Site Scripting)是一種通過在網頁中注入惡意腳本
,從而竊取用戶數據或控制用戶行為的攻擊方式。注入的js跟網頁與原有的js具有同樣的權限
,可以獲得server端數據、可以獲取cookie等。根據攻擊原理和場景,主要分為以下三類:
1. 反射型 XSS(非持久型)
- 原理:攻擊者通過電子郵件等方式將包含
惡意腳本的鏈接
發送給目標用戶,當用戶點擊鏈接時,服務器將帶有惡意腳本的數據反射回
用戶的瀏覽器,瀏覽器解析并執行這段腳本。 - 場景舉例:
惡意鏈接:http://example.com/search?keyword=<script>alert('XSS');</script>
用戶點擊后,服務器返回的搜索結果頁面中包含惡意腳本,瀏覽器執行后彈出彈窗(實際攻擊會更隱蔽,如竊取 Cookie)。 - 特點:
- 攻擊
不存入服務器數據庫,依賴用戶主動觸發
。 - 常見于搜索框、登錄表單等用戶輸入直接顯示的場景。
- 攻擊
- 解決方法:
- 對用戶輸入進行
嚴格的驗證和過濾
,確保輸入內容符合預期。 - 在將用戶輸入輸出到頁面時,
進行HTML編碼
,將特殊字符(如<、>)轉換為HTML實體
。
<script>alert('XSS');</script>
<script>alert('XSS');</script>
- 使用Web應用防火墻(WAF)等安全工具檢測和阻止XSS攻擊。
- 對用戶輸入進行
2. 存儲型 XSS(持久型)
- 原理:攻擊者將惡意腳本存入網站的
數據庫
中(如評論區、用戶資料等),當其他用戶訪問該頁面時,服務器從數據庫中讀取并渲染包含惡意腳本的內容,自動觸發攻擊
。 - 場景舉例
攻擊者在論壇發布一條包含惡意腳本的評論:<img src=x onerror="alert('XSS');">
,其他用戶瀏覽該評論時,瀏覽器執行腳本。應為該評論存儲到了數據庫中 - 特點:
- 攻擊腳本
持久存儲
在服務器,影響范圍廣(所有訪問該頁面的用戶)。 - 常見于社交網站、博客、留言板等用戶可提交內容并長期展示的平臺。
- 攻擊腳本
- 解決方法:
- 在存儲用戶輸入之前,對
輸入內容進行嚴格的過濾和編碼
。 - 使用
內容安全策略(CSP)
限制網頁可以加載的資源,減少XSS攻擊的機會。 - 定期對存儲的數據進行
安全審計
,及時發現和清理潛在的惡意腳本。
- 在存儲用戶輸入之前,對
3. DOM 型 XSS(基于文檔對象模型)
- 原理:攻擊不依賴服務器端處理,而是通過修改客戶端頁面的 DOM 結構,將惡意腳本注入到瀏覽器解析的頁面中。例如,利用 JavaScript 獲取 URL 參數并動態插入到頁面元素中,且未對參數進行過濾。
- 場景舉例:
- 頁面代碼存在漏洞:
document.getElementById("demo").innerHTML = window.location.hash.slice(1);
- 攻擊者構造
URL:http://example.com/#<script>alert('XSS');</script>
,瀏覽器解析時將哈希值插入到頁面,執行腳本。
- 頁面代碼存在漏洞:
- 特點:
- 攻擊完全發生在客戶端,
服務器日志可能無法記錄
。 - 依賴前端代碼對用戶輸入的處理漏洞。
- 攻擊完全發生在客戶端,
- 解決方法:
- 在前端代碼中對所有
用戶可控的輸入
(如URL參數)進行嚴格的驗證和編碼。 - 使用現代
Web框架(如React、Vue.js)的自動轉義功能
,避免直接操作DOM。 - 使用
安全庫
(如DOMPurify)對輸入數據進行凈化。
- 在前端代碼中對所有
跨站請求偽造 (CSRF)
- 攻擊方式:攻擊者誘導用戶在已登錄的狀態下,訪問一個惡意網站或點擊惡意鏈接,從而在用戶不知情的情況下,利用用戶的會話信息向目標網站發送偽造的請求。
- 解決方法:
在表單提交時,添加一個唯一的Token值,并在服務器端驗證該Token。
驗證HTTP請求頭中的Referer值是否來自同一域名。
使用雙重身份驗證(如手機驗證碼)增強敏感操作的安全性。
部署HTTPS協議,確保通信過程的安全。
DOS攻擊
- 攻擊方式:攻擊者通過發送大量請求或數據包,使目標服務器或網絡資源過載,導致正常用戶無法訪問服務。
- 解決方法:
部署防火墻和入侵檢測系統(IDS),檢測并阻止異常流量。
使用負載均衡技術,分散攻擊流量。
限制單個IP地址的請求頻率,防止惡意流量集中攻擊。
定期更新系統和軟件,修復已知的安全漏洞。
會話劫持(Session Hijacking)
- 攻擊方式:攻擊者通過竊取用戶的會話標識(如Session ID),冒充用戶身份進行非法操作。
- 解決方法:
使用HTTPS協議加密通信過程,防止Session ID被竊取。
設置Cookie的HttpOnly屬性,防止JavaScript腳本訪問Cookie。
定期更新會話ID,并在用戶登錄時重新生成會話ID。
設置會話超時,避免用戶長時間不操作時會話信息依然有效。
點擊劫持(Clickjacking)?
- 攻擊方式:攻擊者通過在用戶瀏覽器中嵌入不可見的惡意頁面,誘導用戶點擊看似正常的按鈕或鏈接,從而觸發惡意操作。
- 解決方法:
使用X-Frame-Options或Content-Security-Policy響應頭,防止頁面被嵌入到其他頁面中。
在頁面中添加透明的保護層,防止用戶點擊被劫持。
提醒用戶注意識別惡意鏈接和頁面,避免點擊不可信的內容。