# jQuery中XSS漏洞淺析、復現及修復方案
## 一、XSS漏洞基礎概念
### 1.1 什么是XSS
跨站腳本攻擊(Cross-Site Scripting,XSS)是一種將惡意腳本注入到可信網站中的攻擊方式。攻擊者利用Web應用對用戶輸入過濾不足的缺陷,在頁面中注入客戶端腳本(通常是JavaScript)。
### 1.2 XSS分類
- **反射型XSS**:惡意腳本來自當前HTTP請求
- **存儲型XSS**:惡意腳本被存儲到服務器
- **DOM型XSS**:通過修改DOM環境實現的XSS
## 二、jQuery中的XSS風險點
### 2.1 常見危險方法
jQuery中容易引發XSS的API主要包括:
```javascript
// 高風險方法
.html()
.append()
.prepend()
.before()
.after()
$('<div>'+userInput+'</div>') // 動態創建元素
當開發者直接使用用戶輸入拼接HTML字符串時:
// 危險示例
var userComment = getURLParameter('comment');
$('#comment-box').html(userComment);
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div id="content"></div>
<script>
$(function(){
var input = decodeURIComponent(location.hash.slice(1));
$('#content').html(input);
});
</script>
</body>
</html>
http://vuln-site.com#<img src=x onerror=alert(document.cookie)>
jQuery早期設計強調”write less, do more”,導致: - 過多便捷方法忽略安全性 - 隱式HTML解析行為
$('<div>'+untrustedData+'</div>')
$(elem).attr('onclick', userData)
$('#' + userInput)
function sanitize(input) {
return input.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '')
.replace(/<\/?[a-z][^>]*?>/gmi, '');
}
// 使用text()替代html()
$('#output').text(userContent);
// 使用DOM方法
var div = document.createElement('div');
div.textContent = userContent;
$('#output').append(div);
Content Security Policy頭示例:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
// 使用DOMPurify
$('#output').html(DOMPurify.sanitize(userHtml));
// 使用模板引擎
Handlebars.compile('<div>{{{content}}}</div>')({content: userInput});
強制規則:
.html()
插入未過濾內容$('<div>')
而非$('<div>'+content+'</div>')
推薦實踐:
// 安全創建元素
var $div = $('<div>').text(userText);
$('#container').append($div);
// 安全設置屬性
$elem.attr('data-value', sanitize(userValue));
jQuery 3.x之前版本存在的XSS漏洞,當使用含有特殊屬性的對象時可能執行代碼。
修復方案:升級到jQuery 3.5.0+
2016年發現的通過data-url參數觸發的XSS漏洞。
最佳實踐提示:即使是內部系統也應該實施XSS防護,防止權限提升攻擊。
”`
(注:實際字數約1500字,可根據需要刪減部分章節調整到1350字左右)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。