对于软件开发人员来讲,理解同源策略。可以很是好地攻克了一个痛点。 不一样域名下的资源读写 !javascript
古代的楚河汉界明白地规定了两方的活动界限。假设没有这些界限,天下必将大乱。相同,在咱们的浏览器,也有着一些界限和策略,才让 Web 世界之因此能如此美好地呈现在咱们面前。这些安全策略有效地保障了用户计算机的本地安全与Web安全。html
浏览器有一个很是重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议。port一样。不一样源的client脚(javascript、ActionScript)本在没明白受权的状况下,不能读写对方的资源。java
同源策略,它是由 Netscape 提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。
实际上。这样的策略仅仅是一个规范,并不是强制要求,各大厂商的浏览器仅仅是针对同源策略的一种实现。jquery
它是浏览器最核心也最主要的安全功能。假设缺乏了同源策略。则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之的。web
假设Web世界没有同源策略,当你登陆Gmail邮箱并打开还有一个网站时。这个网站上的JavaScript就可以跨域读取你的Gmail邮箱数据,这样整个Web世界就无隐私可言了。ajax
cookie 劫持 浏览器中的 cookie就变得很不安全,a 域名下的网页,就可以读取你浏览器中的所有 cookie,假设攻击者能获取到用户登录凭证的Cookie,甚至可以绕开登录流程。直接设置这个cookie的值,来訪问用户的帐号。json
不一样源举例跨域
同源举例
http://www.bigertech.com/a、http://www.bigertech.com/b,这两个url 仅仅是在同一个域名如下的不一样文件夹,天然是符合同源策略的浏览器
client的攻击主要来自javascript的脚本,通常体现在对未受权的资源进行读写操做。安全
Web上的资源有很是多。有的仅仅有读权限,有的同一时候拥有读和写的权限。比方:HTTP请求头里的Referer(表示请求来源)仅仅可读。同源和不一样源就是依据这个Referer值进行推断的。 而document.cookie则具有读写权限。
这种区分也是为了安全上的考虑。
比方:在 a 页面使用 AJAX 发送一个请求,请求的地址是另一个网站,
注:
AJAX是Asynchronous JavaScript And XML的缩写。让数据在后台进行异步传输。常见的使用场景有:对网页的局部数据进行更新时,不需要刷新整个网页。以节省带宽资源。
AJAX也是黑客进行Webclient攻击常用的技术,因为这样攻击就可以悄无声息地在浏览器后台进行。作到“杀人无形”。
点击查看响应数据:手机归属地 API
假设使用 ajax 发送请求。像如下这样
$.ajax('http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443');
响应数据,oop 报错了
XMLHttpRequest cannot load http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.baidu.com' is therefore not allowed access.
因为不一样源,浏览器把这个操做给拦截了,而后返回一个错误给用户。
目标网站,假如是http://tcc.taobao.com明白返回HTTP响应头:
Access-Control-Allow-Origin: http://www.evil.com
或者设置为 *, 赞成所有站点进行同源訪问,但是这样也太不安全了。
JSONP(JSON with Padding)是一个非官方的协议。它赞成在server端集成Script tags返回至client,经过javascript callback的形式实现跨域訪问(这不过JSONP简单的实现形式)。
client
在client调用提供JSONP支持的URL Service。获取JSONP格式数据。
比方客户想訪问http://www.yiwuku.com/myService?
jsonp=onCustomerLoaded
若是客户指望返回JSON数据:["customername1","customername2"]
那么真正返回到client的 数数据:
callbackFunction([“customername1","customername2"])
<script type="text/javascript"> function onCustomerLoaded(result, methodName){ conssole.log(result);// 输出结果 ["customername1","customername2"] } </script> <script type="text/javascript" src="http://www.yiwuku.com/myService?jsonp=onCustomerLoaded"></script>
server端:
String callback = request.getParameter("callback"); out.println(callback + "('" + data+ "')");
或者使用 jquery 的ajax 解决方式
$.ajax({ url: 'http://localhost:8080/test2/searchJSONResult.action', type: "GET", dataType: 'jsonp', data: {name:”ZhangHuihua”}, timeout: 5000, success: function (json) { //clientjquery预先定义好的callback函数,成功获取跨域server上的json数据后,会动态运行这个callback函数 alert(json); }, error: function (){ alert("请求失败!"); } });
HTML中的script标签可以载入并运行其它域的JavaScript,因而咱们可以经过script标记来动态载入其它域的资源。
JSONP易于实现,但是也会存在一些安全隐患,假设第三方的脚本任意地运行。那么它就可以篡改页面内容,截获敏感数据。但是在受信任的两方传递数据,JSONP是很合适的选择。
JSONP为解决跨站问题带来便利的同一时候。也存在必定的潜在风险。如下以实例说明其风险。
比方jsonpTest.htm提供jsonp格式的调用。返回如如下格式的callBack({"json":"jsonTest"})
的数据。
脚本注入
未对回调的函数名以及输入内容进行过两次。
比方用户输入如如下请求:
xxx.com/jsonpTest.htm?
jsonp=alert('OK');
则若server只是滤,响应内容为alert("OK");{"json":"jsonTest"}
假设 jsonp 请求为:
xxx.com/jsonpTest.htm?jsonp=<img onclick=”xxx”/>
则若server只是滤,响应内容为:
<img onclick=”xxx”/>;{xx}
用户点击图片,也会有xss攻击。
恶意攻击
对输入的内容进行安全转义过滤,却未限定jsonp回调的合法的字符。如下參数通过安全转义后仍然不变。
while(true){alert(document.cookie)} 攻击者就可以使用此參数对用户进行恶搞。
<img>,<script>,<link>,<iframe>
元素,经过src,href属性设置为目标url。实现跨域请求targetWindow.postMessage(data, origin);
,当中data是需要发送的对象,origin是目标窗体的origin。window.addEventListener('message', handler, false);
handler的event.data是postMessage发送来的数据,event.origin是发送窗体的origin,event.source是发送消息的窗体引用