关于跨域的相关记录

    跨域是一个经常会遇到的问题,记录一下mdn的相关文章

当一个资源请求一个其它域名或者另外一个端口的资源时会产生一个跨域http请求(cross-origin HTTP request)。比如说,http://domaina.example的某html页面通过 <img> 的src 请求 http://domainb.foo/image.jpg。在当今的 web 开发中,许多页面都会从另外一个站点加载各类资源(包括css、图片、JavaScript 脚本以及其它类资源)。

出于安全考虑,浏览器会限制脚本中发起的跨域请求。比如,使用 XMLHttpRequest 和 Fetch 发起 HTTP 请求就必须遵守同源策略。所以,Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求,而不能向任何其它域名发起请求。 为了改进/提升Web应用程序,开发人员要求浏览器供应商允许跨域请求。 (译者注:这段描述跨域不准确,跨域并非浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP,比如chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。)

跨源资源共享 ( CORS )机制让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。需要特别注意的是,这个规范是针对API容器的(比如说 XMLHttpRequest 或者 Fetch ),以减轻跨域HTTP请求的风险。

这篇文章适用于网站管理员、服务器端程序开发人员以及前端开发人员。现代浏览器支持跨源共享的客户端组件,包括请求头和策略执行。同样,服务器端则需要解析这些新的请求头,并按照策略返回相应的响应头以及所请求的资源。对于服务器端程序开发人员,还可以阅读补充材料 cross-origin sharing from a server perspective (with PHP code snippets) 。

balabala一堆header头,下面重点记录一下cookie跨域

附带凭证信息的请求

XMLHttpRequest和访问控制功能,最有趣的特性就是,发送凭证请求(HTTP Cookies和验证信息)的功能。一般而言,对于跨站请求,浏览器是不会发送凭证信息的。但如果将XMLHttpRequest的一个特殊标志位设置为true,浏览器就将允许该请求的发送。

http://foo.example站点的脚本向http://bar.other站点发送一个GET请求,并设置了一个Cookies值。脚本代码如下:

var invocation = new XMLHttpRequest();var url = 'http://bar.other/resources/credentialed-content/';
    function callOtherDomain(){
  if(invocation) {
    invocation.open('GET', url, true);
    invocation.withCredentials = true;
    invocation.onreadystatechange = handler;
    invocation.send(); 
  }

如你所见,代码将XMLHttpRequestwithCredentials标志设置为true,从而使得Cookies可以随着请求发送。因为这是一个简单的GET请求,所以浏览器不会发送一个“预请求”。但是,如果服务器端的响应中,如果没有返回Access-Control-Allow-Credentials: true的响应头,那么浏览器将不会把响应结果传递给发出请求的脚本程序,以保证信息的安全。

还有一种很古老的协议能够保证cookie跨域,在做SSO单点登录的时候会很有效

P3P协议


浏览器默认允许第三方Cookie是否支持P3P禁止第三方Cookie后,配置P3P简明策略头的效果补充
IE6

HTTP可读写Cookie
js可读Cookie
首次读到P3P头,JS无写Cookie权限.第二次才OK

(第二次.直接Cache.也不行.除非第一次非Cache并读到p3p头.后面我会提到解决方案.)

避免JS的写操作
IE7-IE9HTTP、JS,可随意读写.-
FireFoxHTTP、JS都不可读写-
Chrome部分支持,趋势-否趋势为HTTP、JS可读不可写.-
SafariHTTP、JS可读不可写借助Post提交表单,实现写操作.
OperaJS可读写
HTTP可读不可写.
-

php设置P3P头


header(’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);


本文标题:关于跨域的相关记录
本文链接:https://56way.com/p/99.html
作者授权:除特别说明外,本文由 无路 原创编译并授权 小无路 刊载发布。
版权声明:本文使用「署名-非商业性使用 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。