在介紹XSS以前首先來了解一下同源策略,由於它是瀏覽器最核心也最基本的安全功能。javascript
同源(協議、host(域名或IP地址,若是是IP地址則看做一個根域名)、端口號相同)策略限制了來自不一樣源的"document"或腳本,對當前"document"讀取或設置某些屬性。php
script、img、iframe、link等標籤均可以跨域加載資源,它其實是由瀏覽器發起了一次GET請求。不一樣於XMLHttpRequest的是,瀏覽器限制了JavaScript的權限,使其不能讀、寫返回的內容。XMLHttpRequest受到同源策略的約束,不能跨域訪問資源。html
XSS攻擊,一般指黑客經過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。一開始,這種攻擊的演示案例是跨域的,因此叫作"跨站腳本",如今是否跨域已經再也不重要,可是名字一直沿用下來。java
假如用戶輸入的參數直接輸出到頁面上:跨域
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>
複製代碼
用戶提交了一段HTML代碼瀏覽器
http://www.a.com/test.php?param=<script>alert(/xss/)</script>
複製代碼
alert(/xss/)就會在頁面中執行。安全
這就是XSS的一種:反射型XSS。bash
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script> function test() { var str = document.getElementById('text').value; document.getElementById('t').innerHTML = "<a href='" + str + "' >testLink</a>"; } </script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()" />
</body>
</html>
複製代碼
輸入框構造以下數據:服務器
' onclick=alert(/xss/) // 複製代碼
它先用一個單引號閉合掉href的第一個單引號,而後插入一個onclick事件,最後再用註釋符「//」註釋掉第二個引號。 輸入後,頁面代碼變成了:xss
<a href="" onclick="alert(/xss/)" '>testLink</a>
複製代碼
點擊新生成的這個連接,腳本將被執行。
其實還能夠選擇閉合掉<a>
標籤,並插入一個新的HTML標籤:
'><img src=# onerror=alert(/xss2/) /><'
複製代碼
頁面代碼變成
<a href="">
<img src="#" onerror="alert(/xss2/)"><''>
testLink
</a>
複製代碼
腳本直接被執行,彈出/xss2/。