从而突破同源策略防御,实现ajax跨域的解决办法捕获数据的目的,下面哪些方法可以实现

记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。同源策略是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript&的浏览器都会使用这个策略。实际上,这种策略只是一个规范,并不是强制要求,各大厂商的浏览器只是针对同源策略的一种实现。它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。如果Web世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的FreeBuf账号数据,这样整个Web世界就无隐私可言了。情景设想将一个学校内的学生看作不同源的个体。虽然一个班级里面有许多学生,但是他们都是互不相关的个体。学生家长请求老师提供同学们的学习成绩报告,老师会告诉家长,你只能够查看自家孩子的学习成绩报告。同理,学校收到请求要对一个学生的学习成绩进行评价,那么在出具评价报告之前,学校需要对请求者的身份进行确认。这就是与浏览器密切相关的同源策略继续假设,学校允许任何人不经过身份确认查看学生的学习成绩报告,这就和浏览器没有同源策略一样。同源策略机制为现代广泛依赖于cookie维护用户会话的Web浏览器定义了一个特殊的功能,严格隔离不相关的网站提供的内容,防止客户端数据机密性或完整性丢失。同源策略重要吗?假设你已经成功登录Gmail服务器,同时在同一个浏览器访问恶意站点(另一个浏览器选项卡)。没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说阅读你的私密邮件,发送虚假邮件,看你的聊天记录等等。将Gmail替换为你的银行帐户,问题就大条了。SOP和DOM:同源策略与文档对象模型当我们谈论如何使用JavaScript访问DOM时,我们考虑了URL的三个要素(主机名 + 访问协议 + 端口号)如果不止一个站点拥有相同的主机名、访问协议、端口号,那么他是能够成功访问到DOM的。然而,IE仅仅只是验证主机名以及访问协议,忽略了端口号。在大多数情况下,多个站点可能在同一根域(获取源页面的DOM)。例如,cart.httpsecure.org需要访问login.httpsecure.org来进行身份验证。在这种情况下,网站可以使用document.domain属性允许相同域下的其他站点进行DOM交互。如果你允许cart.httpsecure.org与login.httpsecure.org进行交互,开发者需要在两个站点的根域设置document.domain属性。document.domain&=&“httpsecure.org”这表示在当前页面,httpsecure.org下的任何站点都可以访问DOM资源。当你这样设置后,你应该时刻保持警惕!比如说你部署在网络上的另一个站点about.httpsecure.org,假设这个站点存在漏洞,那么cart.httpsecure.org这个站点也可能存在漏洞并且可以访问这个源。如果攻击者能够上传一些恶意代码,那么about.httpsecure.org也会获得访问其他站点的权限。SOP和CORS:同源策略与跨源资源共享跨源资源共享(CORS)是一种允许多种资源(图片,Css,字体,JavaScript等)在一个web页面请求域之外的另一个域的资源的机制。使用XMLHttpRequest对象发起HTTP请求就必须遵守同源策略。具体而言,Web应用程序能且只能使用XMLHttpRequest对象向其加载的源域名发起HTTP请求,而不能向任何其它域名发起请求。跨源资源共享这种机制让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。如果httpsecure.org源返回下面的响应头,所有httpsecure.org的子域与根域就打开了一个双向的通信通道:Access-Control-Allow-Origin:&*.Httpsecure.orgAccess-Control-Allow-Methods:&OPTIONS,&GET,&POST,&HEAD,&PUTAccess-Control-Allow-Headers:&X-customAccess-Control-Allow-Credentials:&true在上面的响应头中,第一行定义了双向通信通道,第二行定义了请求可以使用OPTIONS, GET, POST, PUT, HEAD中的任何方式,第三行则是定义的响应头,最后一行允许经过身份验证的资源进行通信。SOP与plugins:同源策略与插件注释:如果在httpsecure.org:80安装插件,那么只能允许插件访问httpsecure.org:80由于不同的绕过方法,在Java,Adobe Reader,Flash,Silverlight中实现同源策略是十分痛苦的。大多数浏览器都使用他们自己的方式实现同源策略,如果处在同一个IP地址,一些Java版本会认为两个不同的域名应用同一个同源策略。这对于虚拟主机环境(多个域名使用同一个IP)来说可能是一个毁灭性的灾难。谈论Flash player以及PDF reader插件,他们都有一个悠久的漏洞历史。这些漏洞大多数都是允许攻击者远程执行任意代码,这远比同源策略绕过更可怕!在Flash中,你可以通过crossdomain.xml管理跨源通信,该文件一般在根目录下&?xml&version=&1.0&?&&cross-domain-policy&&site-control&permitted-cross-domain-policies=&by-content-type&/&&allow-access-from&domain=&*.httpsecure.org&&/&&/cross-domain-policy&使用这段代码的httpsecure.org子域可以实现站点的双向通信,Crossdomain.xml还支持Java以及JavaScript插件。SOP与UI redressing:同源策略与界面伪装点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段。该术语最早由雷米亚·格罗斯曼(Jeremiah Grossman)与罗伯特·汉森(Robert Hansen)于2008年提出。这种行为又被称为界面伪装(UI redressing)。对于攻击者同源策略绕过,方法各有不同。事实上一部分攻击还是利用同源策略没有执行。Java同源策略绕过在Java1.7u17版本和1.6u45版本中,如果两个主机名解析到同一个IP地址,那么就不会执行同源策略(Httpsecure.org和 解析到同一个IP地址)。Java applet(是一种在Web环境下,运行于客户端的Java程序组件,每个Applet的功能都比较单一)可以解决跨院请求和读取响应信息。在Java6和Java7版本,如果两个主机名解析到同一个IP地址,那么会被认定为两个主机是相同的。在Java同源策略中实现这种类型的漏洞,那会十分恐怖。特别是对于虚拟主机(多个域名解析到同一个IP地址)来说,那将是毁灭性的灾难。最重要的是,通过applet使用BufferedReader和InputStreamReader对象考虑有关的权限需要。在Java1.6不需要运行applet实现用户交互,在1.7版本就不同了。现在用户必须使用点击播放特性(click to play feature)运行有签名和没有签名的applet,这个特性可以使用IMMUNITY来绕过并且导致了后来的CVE-(在Java中同源策略绕过)。类似的在Adobe reader也发现了同源策略绕过。&appletcode=&malicious.class&archive=&http://httpsecure.org?redirect_to=/malicious.jar&width=&100&&height=&100&&&/applet&Adobe Reader同源策略绕过Adobe Reader在浏览器插件中存在许多的安全问题,其大部分漏洞都是由于溢出问题导致的任意代码执行漏洞。在Adobe Reader PDF中可以使用JavaScript,正是这个原因,所以有很多恶意软件将代码隐藏在PDF文件之中。CVE-通过未明向量,远程攻击者利用该漏洞绕过预期的访问限制。如果我们谈论到XXE Injection,这涉及到试图注入恶意负载到请求中,输入如下:&!DOCTYPE&bar&&&!ELEMENT&bar&ANY&&&!ENTITY&xxe&SYSTEM&&/etc/passwd&&&]&&bar&&&/bar&&XXE的值取而代之的是/etc/passwd,这项技术可以被用到同源策略绕过,它会加载XE并且服务器会返回一个302重定向响应。Adobe Flash同源策略绕过Adobe Flash使用crossdomain.xml文件控制Flash接收数据。我们可以在该文件中添加限制,只信任添加在内的站点。&?xml&version=&1.0&?&&cross-domain-policy&&site-control&permitted-cross-domain-policies=&by-content-type&/&&allow-access-from&domain=&*&&/&&/cross-domain-policy&通过设置allow-access-from属性的域,您可以允许访问来自任何域的文档。Silverlight同源策略绕过Silverlight是微软推出的一款插件,其与Flash使用相同的同源策略。然而,其使用的clientaccess-policy.xml代码如下所示:&?xml&version=&1.0&&encoding=&utf-8&?&&access-policy&&cross-domain-access&&policy&&allow-from&&domain&uri=&*&/&&/allow-from&&grant-to&&resource&path=&/&&include-subpaths=&true&/&&/grant-to&&/policy&&/cross-domain-access&&/access-policy&请记住Silverlight与Flash是不同的,如Silverlight没有隔离基于协议和端口的不同源的访问,而Flash就会隔离。所以在Silverlight中&https://Httpsecure.org& 和 http://Httpsecure.org& 会被认为是同源。Internet Explorer同源策略绕过Internet Explorer8以及前面的版本很容易通过document.domain实现同源策略绕过,通过重写文档对象,域属性这个问题可以十分轻松的被利用。var&document&=&{};document.domain&=&‘httpsecure.org';alert(document.domain);如果你在最新的浏览器中运行这段代码,可能在JavaScript控制台会显示一个同源策略绕过错误。参考文献http://en.wikipedia.org/wiki/Same-origin_policyhttp://en.wikipedia.org/wiki/Cross-origin_resource_sharinghttp://en.wikipedia.org/wiki/Clickjacking/*&参考来源,译者/鸢尾 转载请注明来自FreeBuf黑客与极客()
阅读:977 | 评论:0 | 标签:
想收藏或者和大家分享这篇好文章→
? 关注Hackdig微博,点击下方按钮?
? 关注Hackdig微信,学习技术更方便浏览器拦截跨域请求处理方法(firebug报错,同源策略不允许读取XXX上的远程资源)
浏览器拦截跨域请求处理方法(firebug报错,同源策略不允许读取XXX上的远程资源)
[摘要:1. 若是可使用get要求的话,可使用jsonp。非常简略的方式。 2. 若是要应用post要求域名没有沟通的资本的话,能够用cors跨域。 以下两项缺一弗成: 1) 正在被要求的项目根目次(root下)]
1. 如果可以使用get请求的话,可以使用jsonp。十分简单的方法。
2. 如果要使用post请求域名不相同的资源的话,可以用cors跨域。
以下两项缺一不可:
&&&&& 1) 在被请求的项目根目录(root下)下放以下文件
&&&&& crossdomain.xml
&?xml version=&1.0&?& &!DOCTYPE cross-domain-policy SYSTEM &./cross-domain-policy.dtd&& &cross-domain-policy& &site-control permitted-cross-domain-policies=&all& /&
&allow-access-from domain=&*& /&
&allow-http-request-headers-from domain=&*& headers=&*&/& &/cross-domain-policy&&&&& cross-domain-policy.dtd
&?xml version=&1.0& encoding=&ISO-8859-1&?& &!-- Adobe DTD for cross-domain policy files --& &!-- Copyright (c) , Adobe Systems Inc. --&
&!ELEMENT cross-domain-policy (site-control?,allow-access-from*,allow-http-request-headers-from*,allow-access-from-identity*)&
&!ELEMENT site-control EMPTY& &!ATTLIST site-control permitted-cross-domain-policies (all|by-content-type|by-ftp-filename|master-only|none) #REQUIRED&
&!ELEMENT allow-access-from EMPTY& &!ATTLIST allow-access-from domain CDATA #REQUIRED& &!ATTLIST allow-access-from to-ports CDATA #IMPLIED& &!ATTLIST allow-access-from secure (true|false) &true&&
&!ELEMENT allow-http-request-headers-from EMPTY& &!ATTLIST allow-http-request-headers-from domain CDATA #REQUIRED& &!ATTLIST allow-http-request-headers-from headers CDATA #REQUIRED& &!ATTLIST allow-http-request-headers-from secure (true|false) &true&&
&!ELEMENT allow-access-from-identity (signatory)&
&!ELEMENT signatory (certificate)&
&!ELEMENT certificate EMPTY& &!ATTLIST certificate fingerprint CDATA #REQUIRED& &!ATTLIST certificate fingerprint-algorithm CDATA #REQUIRED&
&!-- End of file. --&
&&&& & 测试从http://domain:port/crossdomain.xml可访问到这两个xml。
&&&& 2.)被请求的目标在返回时需加Responseheader&& Access-Control-Allow-Origin
&&&&&&& response.setHeader(&Access-Control-Allow-Origin&, &*&);
&&&&&& 后面的*可以是请求方的域名。
再次尝试,firebug控制台不会报错了~
感谢关注 Ithao123JS频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊posts - 32,&
comments - 94,&
trackbacks - 0
浅析JSONP-解决Ajax跨域访问问题
&&& 很久没有写随笔了,总是感觉没时间,其实时间就是。。。废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息。实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应,怎么回事?代码没怎么改动,唯一修改的地方就是jQuery的ajax方法中的url地址。难道是这里的问题,经过检查和调试,发现原来是同源策略在作怪,我们知道,JavaScript或jQuery是在Web前端开发中经常使用的动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为&Same- Origin Policy&(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档或脚本 在同一域名下的内容。不同域名下的脚本不能互相访问,即便是子域也不行。关于同源策略,读者可百度更详细的解释,这里不再赘述。
但是有时候又不可避免地需要进行跨域操作,这时候&同源策略&就是一个限制了,怎么办呢?采用JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并探讨下JSONP跨域的原理。
这里提到了JSONP,那有人就问了,它同JSON有什么区别不同和区别呢,接下我们就来看看,百度百科有以下说明:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)。
JSONP(JSON with Padding)是的 一种&使用模式&,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于
的网页无法与不是 的服务器沟通,而 HTML 的&script& 元素是一个例外。利用 &script& 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
到这里,应该明白了,JSON是一种轻量级的数据交换格式,像xml一样,是用来描述数据间的。JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。
那JSONP是如何工作的呢,我们知道,由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。若要跨域请求出于安全性考虑是不行的,但是我们发现,Web页面上调用js文件时则不受是否跨域的影响,而且拥有&src&这个属性的标签都拥有跨域的能力,比如&script&、&img&、&iframe&,这时候,聪明的程序猿就想到了变通的方法,如果要进行跨域请求, 通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递 javascript对象。即在跨域的服务端生成JSON数据,然后包装成script脚本回传,着不就突破同源策略的限制,解决了跨域访问的问题了么。
下面我们就看下怎么实现:
前端代码:
function CallWebServiceByJsonp() {
$("#SubEquipmentDetails").html('');
type: "GET",
cache: false,
url: "http://servername/webservice/webservice.asmx/GetSingleInfo",
data: { strCparent: $("#Equipment_ID").val() },
dataType: "jsonp",
//jsonp: "callback",
jsonpCallback: "OnGetMemberSuccessByjsonp"
function OnGetMemberSuccessByjsonp(data) {
//处理data
alert(data);
后端的WebService代码:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public void GetSingleInfo(string strCparent)
string ret = string.E
HttpContext.Current.Response.ContentType = "application/charset=utf-8";
string jsonCallBackFunName = HttpContext.Current.Request.Params["callback"].ToString();
//string jsonCallBackFunName1 = HttpContext.Current.Request.QueryString["callback"].Trim();
//上面代码必须
//中间代码执行自己的业务操作,可返回自己的任意信息(多数据类型)
BLL.equipment eq_bll = new BLL.equipment();
List&Model.equipment& equipmentList = new List&Model.equipment&();
equipmentList = eq_bll.GetModelEquimentList(strCparent);
ret = JsonConvert.SerializeObject(equipmentList);
//下面代码必须
HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, ret));
HttpContext.Current.Response.End();
如上所示,前端的CallWebServiceByJsonp方法采用jQuery的ajax方法调用后端的Web服务GetSingleInfo方法,后台的GetSingleInfo方法,使用前端的回调方法OnGetMemberSuccessByjsonp包装后台的业务操作的JSON对象,返回给前端一段javascript片段执行。巧妙的解决了跨域访问问题。
JSONP的缺点:
JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 ajax跨域请求 的文章

 

随机推荐