- 做者:陳大魚頭
- github: KRISACHAN
- 連接:github.com/YvetteLau/S…
- 背景:最近高級前端工程師 劉小夕 在 github 上開了個每一個工做日佈一個前端相關題的 repo,懷着學習的心態我也參與其中,如下爲個人回答,若是有不對的地方,很是歡迎各位指出。
跨站腳本(英語:Cross-site scripting,一般簡稱爲:XSS)是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它容許惡意用戶將代碼注入到網頁上,其餘用戶在觀看網頁時就會受到影響。這類攻擊一般包含了HTML以及用戶端腳本語言。javascript
XSS攻擊一般指的是經過利用網頁開發時留下的漏洞,經過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序一般是JavaScript,但實際上也能夠包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功後,攻擊者可能獲得更高的權限(如執行一些操做)、私密網頁內容、會話和cookie等各類內容。php
當網景(Netscape)最初推出JavaScript語言時,他們也察覺到准許網頁服務器發送可執行的代碼給一個瀏覽器的安全風險(即便僅是在一個瀏覽器的沙盒裏)。它所形成的一個關鍵的問題在於用戶同時打開多個瀏覽器視窗時,在某些例子裏,網頁裏的片段代碼被容許從另外一個網頁或對象取出數據,而由於惡意的網站能夠用這個方法來嘗試竊取機密信息,因此在某些情形,這應是徹底被禁止的。爲了解決這個問題,瀏覽器採用了同源決策——僅容許來自相同域名系統和使用相同協議的對象與網頁之間的任何交互。這樣一來,惡意的網站便沒法藉由JavaScript在另外一個瀏覽器竊取機密數據。此後,爲了保護用戶免受惡意的危害,其餘的瀏覽器與伺服端指令語言採用了相似的訪問控制決策。html
XSS漏洞能夠追溯到1990年代。大量的網站曾遭受XSS漏洞攻擊或被發現此類漏洞 。研究代表,最近幾年XSS已經超過緩衝區溢出成爲最流行的攻擊方式,有68%的網站可能遭受此類攻擊。根據開放網頁應用安全計劃(Open Web Application Security Project)公佈的2010年統計數據,在Web安全威脅前10位中,XSS排名第2,僅次於代碼注入(Injection)。前端
一般有一些方式能夠測試網站是否有正確處理特殊字符:java
><script>alert(document.cookie)</script>
node
='><script>alert(document.cookie)</script>
git
"><script>alert(document.cookie)</script>
github
<script>alert(document.cookie)</script>
數據庫
<script>alert (vulnerable)</script>
express
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
<img src="http://888.888.com/999.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)"></div>(這個僅於IE7(含)以前有效)
攻擊者使被攻擊者在瀏覽器中執行腳本後,若是須要收集來自被攻擊者的數據(如cookie或其餘敏感信息),能夠自行架設一個網站,讓被攻擊者經過JavaScript等方式把收集好的數據做爲參數提交,隨後以數據庫等形式記錄在攻擊者本身的服務器上。
經常使用的XSS攻擊手段和目的有:
盜用cookie,獲取敏感信息。
利用植入Flash,經過crossdomain權限設置進一步獲取更高權限;或者利用Java等獲得相似的操做。
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動做,或執行一些通常的如發微博、加好友、發私信等操做。
利用可被攻擊的域受到其餘域信任的特色,以受信任來源的身份請求一些平時不容許的操做,如進行不當的投票活動。
在訪問量極大的一些頁面上的XSS能夠攻擊一些小型網站,實現DDoS攻擊的效果。
避免XSS的方法之一主要是將用戶所提供的內容進行過濾,許多語言都有提供對HTML的過濾:
PHP的htmlentities()或是htmlspecialchars()。
Python的cgi.escape()。
ASP的Server.HTMLEncode()。
ASP.NET的Server.HtmlEncode()或功能更強的Microsoft Anti-Cross Site Scripting Library
Java的xssprotect (Open Source Library)。
Node.js的node-validator。
不少時候可使用HTTP頭指定內容的類型,使得輸出的內容避免被做爲HTML解析。如在PHP語言中使用如下代碼:
<?php
header('Content-Type: text/javascript; charset=utf-8');
?>
複製代碼
便可強行指定輸出內容爲文本/JavaScript腳本(順便指定了內容編碼),而非能夠引起攻擊的HTML。
也能夠設置 HTML 的 <meta>
標籤:
<meta http-equiv="content-security-policy">
複製代碼
"content-security-policy" 內容安全策略 它容許頁面做者定義當前頁的 內容策略。 內容策略主要指定容許的服務器源和腳本端點,這有助於防止跨站點腳本攻擊。