- 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。
- 跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
- 在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。
HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记, 例如,小于符号(
<
)被看作是HTML
标签的开始,<title>
与</title>
之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<
)时, 用户浏览器会将其误认为是插入了HTML
标签,当这些HTML
标签引入了一段JavaScript
脚本时,这些脚本程序就将会在用户浏览器中执行。 所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS
漏洞。
XSS攻击大致上分为两类
- 一类是反射型
XSS
,又称非持久型XSS
。 - 一类是储存型
XSS
,也就是持久型XSS
。
反射型XSS
攻击相对于访问者而言是一次性的
储存型XSS
将攻击代价储存到数据库中,然后当我们再次访问相同页面时,将恶意脚本从数据库中取出并返回给浏览器执行。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。
危害
XSS的攻击方式就是想办法通过插入js
代码,使用户的浏览器去执行一些这个网页中原本不存在的前端代码。
窃取网页浏览中的cookie值
在网页浏览中我们常常涉及到用户登录,登录完毕之后服务端会返回一个cookie
值。这个cookie
值相当于一个令牌,拿着这张令牌就等同于证明了你是某个用户。
如果你的cookie
值被窃取,那么攻击者很可能能够直接利用你的这张令牌不用密码就登录你的账户。
如果想要通过script
脚本获得当前页面的cookie
值,通常会用到document.cookie
。
劫持流量实现恶意跳转
就是在网页中想办法插入一句像这样的语句:
<script>window.location.href="http://www.baidu.com";</script>
那么所访问的网站就会被跳转到百度的首页。
避免XSS攻击
- 过滤
- 有的时候,服务器往往会对代码中的关键字(如
alert
)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用eval()
来实现,eval()
会将编码过的语句解码后再执行。 - 对诸如
<script>
、<img>
、<a>
等标签进行过滤。
- 有的时候,服务器往往会对代码中的关键字(如
- 编码
- 像一些常见的符号,如
<>
在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
- 像一些常见的符号,如
- 限制
- 通过以上的案例我们不难发现xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。