设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 570|回复: 0
打印 上一主题 下一主题

W3C标准中 AJAX 跨域实现以及隐患 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-6-27 01:32:22 |只看该作者 |倒序浏览
    标准也很无奈,标准很难做到 Secure By Default

    最新的W3C标准里是这么实现HTTP跨域请求的,
    Cross-Origin Resource Sharing简单来说,就是跨域的目标服务器要返回一系列的Headers,通过这些Headers来控制是否同意跨域。

    这些Headers有:


    在 Request 包和 Response 包中都有一些。

    其中最敏感的就是 Access-Control-Allow-Origin 这个 Header, 他是W3C标准里用来检查该跨域请求是否可以被通过。 (Access Control Check)

    跨域实现的过程大致如下:

    http://www.a.com/test.html 发起一个跨域请求,

    请求的地址为: http://www.b.com/test.php

    如果 服务器B返回一个如下的header

    Access-Control-Allow-Origin: http://www.a.com

    那么,这个来自 http://www.a.com/test.html 的跨域请求就会被通过。

    在这个过程中, request 还会带上这个header:

    Origin: http://www.a.com


    不过这里比较要命的是 Access-Control-Allow-Origin 的值可以是通配符 *

    如果是 * 的话,就可以接收来自任意source origin的请求。

    我已经可以想象到以后这个特性被程序员滥用以及被用来制作后门的可怕后果了!


    Firefox 3.1 Beta 2 上抓包如下:

    GET http://www.b.com/test.php HTTP/1.1
    Host: www.b.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Paros/3.2.13
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-cn,zh;q=0.5
    Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Proxy-Connection: keep-alive
    Referer: http://www.a.com/test.html
    Origin: http://www.a.com
    Cache-Control: max-age=0



    HTTP/1.1 200 OK
    Date: Thu, 15 Jan 2009 06:28:54 GMT
    Server: Apache/2.0.63 (Win32) PHP/5.2.6
    X-Powered-By: PHP/5.2.6
    Access-Control-Allow-Origin: *
    Content-Length: 28
    Content-Type: text/html

    Cross Domain Request Test!



    两段代码大致如下:
    www.a.com/test.html:
    <script>
    var client = new XMLHttpRequest();
    client.open("GET", "http://www.b.com/test.php");
    client.onreadystatechange = function() { }
    client.send(null);
    </script>

    www.b.com/test.php:
    <?php

    header("Access-Control-Allow-Origin: *");

    ?>

    Cross Domain Request Test!


    除了这个Header外,还可以通过一些其他的Header 来控制比如 Method, 时间等,可以参考标准,不在此赘述。

    出于安全考虑,跨域请求不能访问document.cookie 对象

    对于IE8 Beta 2, 则是通过 XDomainRequest 来实现的这个跨域请求

    比如类似如下代码就可以实现了:

    var request = new XDomainRequest();
    request.open("GET", xdomainurl);
    request.send();

    也要求对方服务器返回这个头才行。


    IE的开发者今天公布了一段小视频:
    http://ieblog.members.winisp.net/images/XdomainRequest-small.wmv


    目前,支持这种跨域实现的要求

    Firefox 3.1 Beta2

    IE 8 Beta2

    等到普及还有一段时间。

    附件: 你需要登录才可以下载或查看附件。没有帐号?注册 人人连接登陆
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-4 14:07 , Processed in 0.182640 second(s), 29 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部