- 做者:陈大鱼头
- 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" 内容安全策略 它容许页面做者定义当前页的 内容策略。 内容策略主要指定容许的服务器源和脚本端点,这有助于防止跨站点脚本攻击。