xss是什么?
跨站腳本攻擊(XSS),是最普遍的Web應用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。
xss的作用
1、盜用cookie,獲取敏感信息。可通過盜用cookie,以受害者的身份訪問頁面,如管理員后台。
2、利用植入Flash,通過crossdomain權限設置進一步獲取更高權限;或者利用Java等得到類似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
4、利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
5、在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。
xss分為反射型、存儲型和dom型,下面的demo屬於反射型xss
public void Message(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
String message = req.getParameter("msg");
try {
resp.getWriter().print(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
xss的修復
輸入過濾
- 對輸入的內容諸如<script>、<img>等標簽進行過濾
- 禁用不需要的事件,如"onmouseover", "onmouseout", "onmousedown"等
- 對符號進行編碼,如<>在輸入的時候要對其進行轉換編碼
純前端渲染
- 瀏覽器先加載一個靜態 HTML,此 HTML 中不包含任何跟業務相關的數據。
- 然后瀏覽器執行 HTML 中的 JavaScript。
- JavaScript 通過 Ajax 加載業務數據,調用 DOM API 更新到頁面上
轉義html
如果拼接 HTML 是必要的,就需要采用合適的轉義庫,對 HTML 模板各處插入點進行充分的轉義。常用的轉義庫為 org.owasp.encoder
輸入內容長度控制
對於不受信任的輸入,都應該限定一個合理的長度。雖然無法完全防止 Xss 發生,但可以增加 Xss 攻擊的難度。
對於明確的輸入類型,例如數字、URL、電話號碼、郵件地址等等內容,進行輸入過濾還是必要的。
Cookie的安全設置
HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入后也無法竊取此 Cookie。
安全驗證
- 驗證碼:防止腳本冒充用戶提交危險操作。(通常用在重要操作時,如修改密碼等)
X-XSS-Protection請求頭
X-XSS-Protection 響應頭是 IE,Edge,Chrome 和 Safari 的一個特性,當檢測到跨站腳本攻擊 (XSS) 時,瀏覽器將停止加載頁面。
- # 0 表示禁止XSS過濾 1 表示開啟XSS過濾
- X-XSS-Protection: 0
- X-XSS-Protection: 1
- # 啟用XSS過濾。 如果檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
- X-XSS-Protection: 1; mode=block
- # 啟用XSS過濾 (谷歌瀏覽器專用)。 如果檢測到跨站腳本攻擊,瀏覽器將清除頁面並使用CSP report-uri指令的功能發送違規報告。
- X-XSS-Protection: 1; report=<reporting-uri>
CSP請求頭
全稱Content-Security-Policy(內容安全策略),允許站點管理者控制用戶代理能夠為指定的頁面加載哪些資源。它通過一系列的指令聲明可以決定URL、多媒體資源、字體的加載策略、腳本的執行策略。具體可以查看Content-Security-Policy文檔。
在響應標頭中設置內容安全策略將允許您告訴瀏覽器永遠不要執行內聯 JavaScript,並選擇可以為頁面托管 JavaScript 的域:
Content-Security-Policy: script-src ‘self’ https://apis.google.com
還可以將內容安全策略放置在頁面元素的<meta>標記中<head>:
<meta http-equiv=”Content-Security-Policy” content=”script-scr ‘self’ https://apis.google.com”>
在Spring Security中可以這樣配置它:
- httpSecurity.headers()
- .contentSecurityPolicy(“script-src https://apis.google.com”)
攔截器
結合 Servlet Filter 或者Spring MVC 攔截器
編寫JSON序列化來實現對JSON返回的轉義,例如Jackson中自定義XSS序列化
class XssStringJsonSerializer extends JsonSerializer<String> {
@Override
Class<String> handledType() {
String.class;
}
@Override
void serialize(String value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
if (value != ) {
jsonGenerator.writeString(HtmlUtils.htmlEscape(value));
}
}
}
參考文章:https://xz.aliyun.com/t/6937
https://blog.csdn.net/weixin_39916520/article/details/114565853
https://netsecurity.51cto.com/art/202106/668949.htm
https://www.neuralegion.com/blog/cross-site-scirpting-prevention/