跨網站指令碼

跨網站指令碼（，通常簡稱為：XSS）是一種網站應用程式的安全漏洞攻擊，是代码注入的一种。它允許惡意使用者將程式碼注入到網頁上，其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端腳本語言。

XSS攻击通常指的是通过利用网页开发时留下的漏洞，通过巧妙的方法注入恶意指令代码到网页，使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript，但实际上也可以包括Java，VBScript，ActiveX，Flash或者甚至是普通的HTML。攻击成功后，攻击者可能得到更高的权限（如执行一些操作）、私密网页内容、会话和cookie等各种内容。

 背景和现状 
當網景（Netscape）最初推出JavaScript語言時，他們也察覺到准許網頁伺服器傳送可執行的程式碼給一個瀏覽器的安全風險（即使僅是在一個瀏覽器的沙盒裡）。它所造成的一個關鍵的問題在於使用者同時開啟多個瀏覽器視窗時，在某些例子裡，網頁裡的片斷程式碼被允許從另一個網頁或对象取出資料，而因為惡意的網站可以用這個方法來嘗試竊取機密資訊，所以在某些情形，這應是完全被禁止的。為了解決這個問題，瀏覽器採用了同源决策——僅允許來自相同網域名稱系統和使用相同協定的物件與網頁之間的任何互動。這樣一來，惡意的網站便無法藉由JavaScript在另一個瀏覽器竊取機密資料。此後，為了保護使用者免受惡意的危害，其他的瀏覽器與伺服端指令語言採用了類似的存取控制決策。

XSS漏洞可以追溯到1990年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞，如Twitter，Facebook、MySpace、Orkut、新浪微博和百度贴吧
。研究表明，最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式，有68%的网站可能遭受此类攻击。根据开放网页应用安全计划（Open Web Application Security Project）公布的2010年统计数据，在Web安全威胁前10位中，XSS排名第2，仅次于代码注入（Injection）。

 縮寫 
的英文首字母縮寫本應為CSS，但因為CSS在網頁設計領域已經被廣泛指層疊樣式表（Cascading Style Sheets），所以將Cross（意为“交叉”）改以交叉形的X做為縮寫。但早期的文件還是會使用CSS表示Cross-site scripting。

 检测方法 
通常有一些方式可以測試網站是否有正確處理特殊字元：
 >alert(document.cookie)
 ='>alert(document.cookie)
 ">alert(document.cookie)
 alert(document.cookie)
 alert('vulnerable')
 %3Cscript%3Ealert('XSS')%3C/script%3E
 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可以攻击一些小型网站，实现DoS攻击的效果。

 漏洞的防御和利用 
 过滤特殊字符 
避免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头指定类型 
很多时候可以使用HTTP头指定内容的类型，使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码：
<?php
   header('Content-Type: text/javascript; charset=utf-8');
?>
即可强行指定输出内容为文本/JavaScript脚本（顺便指定了内容编码），而非可以引发攻击的HTML。

 使用者方面 
包括Internet Explorer、Mozilla Firefox在內的大多数瀏覽器皆有關閉JavaScript的选项，但關閉功能并非是最好的方法，因為許多網站都需要使用JavaScript語言才能正常运作。通常来说，一個經常有安全更新推出的瀏覽器，在使用上會比很久都没有更新的浏览器更为安全。

 参阅 
 内容安全策略
 苍月浏览器—过滤跨網站指令碼（XSS）的网络浏览器
 SGML实体
 Metasploit—一个包含XSS测试的开源渗透测试工具

 参考文献 

 外部連結 
 CERT® Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests  
 Cross Site Scripting Info  
 The Same Origin Policy  
 XSS (Cross Site Scripting) Cheat Sheet 

Category:网络安全
Category:注入漏洞
Category:Web安全漏洞