在介紹XSS以前首先來了解一下同源策略,由於它是瀏覽器最核心也最基本的安全功能。php
同源(協議、host(域名或IP地址,若是是IP地址則看做一個根域名)、端口號相同)策略限制了來自不一樣源的"document"或腳本,對當前"document"讀取或設置某些屬性。html
script、img、iframe、link等標籤均可以跨域加載資源,它其實是由瀏覽器發起了一次GET請求。不一樣於XMLHttpRequest的是,瀏覽器限制了JavaScript的權限,使其不能讀、寫返回的內容。XMLHttpRequest受到同源策略的約束,不能跨域訪問資源。跨域
XSS攻擊,一般指黑客經過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。一開始,這種攻擊的演示案例是跨域的,因此叫作"跨站腳本",如今是否跨域已經再也不重要,可是名字一直沿用下來。瀏覽器
假如用戶輸入的參數直接輸出到頁面上:安全
<?php $input = $_GET["param"]; echo "<div>".$input."</div>"; ?>
用戶提交了一段HTML代碼服務器
http://www.a.com/test.php?param=<script>alert(/xss/)</script>
alert(/xss/)就會在頁面中執行。xss
這就是XSS的一種:反射型XSS。spa
反射型XSS只是簡單地把用戶輸入的數據」反射「給瀏覽器。也就是說黑客每每須要誘使用戶」點擊「一個惡意連接,才能攻擊成功。反射型XSS也叫」非持久型XSS」。code
存儲型XSS會把用戶輸入的數據「存儲」在服務器端。這種XSS具備很強的穩定性。
比較常見的,黑客寫下一篇包含惡意JavaScript代碼的博客文章,文章發表後,全部訪問該博客文章的用戶,都會在他們的瀏覽器中執行這段惡意的JavaScript代碼。黑客把惡意腳本保存在了服務端,這種XSS攻擊就叫作「存儲型XSS」。存儲型XSS也叫作「持久型XSS」。htm
經過修改頁面的DOM節點造成的XSS,稱之爲DOM Based XSS,從效果上來講也是反射型XSS,單獨劃分出來是由於它的造成緣由比較特殊,發現它的安全專家提出了這種類型的XSS。出於歷史緣由把它單獨做爲一個分類了。
<!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事件,最後再用註釋符「//」註釋掉第二個引號。
輸入後,頁面代碼變成了:
<a href="" onclick="alert(/xss/)" '>testLink</a>
點擊新生成的這個連接,腳本將被執行。
其實還能夠選擇閉合掉<a>
標籤,並插入一個新的HTML標籤:
'><img src=# onerror=alert(/xss2/) /><'
頁面代碼變成
<a href=""> <img src="#" onerror="alert(/xss2/)"><''> testLink </a>
腳本直接被執行,彈出/xss2/。