目标是实现双向的跨域访问,即A域的脚本可以操作B域的网页,B域的脚本也可以操作A域的网页。查询资料后发现应该重载InternetSecurityManager的getSecurityID函数以实现。我重载以后,将所有URL都返回同样的SecurityID:{'h','t','t','p',':','w','w','w','.','a','b','c','.','c','o','m',3,0,0,0}希望能够欺骗IE,以为都是相同的域,但是却不能完全成功。如果A域访问B域,而B域是abc.com,则可以成功,但是B域访问A域却不行。其他情况都不行,看来好像需要重载什么函数,请各位高手出马研究研究。

解决方案 »

  1.   

    看来是自制的浏览器吧(IE是不可能的),你还不如实现window.external接口,由它提供属性或方法来获得浏览器页面中任何框架页面的IHTMLDocument2,因为通过IWebBrowser2接口的Document属性是能获得文档接口的,但是仅限于VC通过虚表调用方式获取,脚本的调度接口是无法获取的(安全限制)。
      

  2.   


    浏览器启动以后,首先访问A域的网页,随着用户的操作,A域的网页会在框架中访问B域甚至更多域的网页。A域的网页会和B域等其他域的脚本发生交互的脚本调用,比如top.func1();parent.aa.func2(top.b.document.outerHTML);等调用。什么样的脚本都有,真是应有尽有:)所以,如果不彻底解决,依靠一些针对某个脚本的特殊处理,在这个案例中是行不通的。
      

  3.   

    用InternetSecurityManager的SetZoneMapping函数把网址加到可信站点
      

  4.   


    借问蒋老大一句,SetZoneMapping是主动调用还是被动调用的?如果是我主动调用,如何处理随时可能出现的新域名?
      

  5.   


    我将所有的站点(*://*.*.*.*)都加到了可信站点,而且将可信站点的安全级别降到了最低。可是跨域脚本的权限仍然被限制。
    我又同时使用重载getSecurityID函数试图欺骗,仍然是不行。不知蒋兄是如何实现的?蒋兄可以做一个测试用例:
    a.html
    <frameset rows="50,50">
    <frame src="http://www.baidu.com" id="aa">
    <frame src="b.html" id="bb">
    </frameset>
    -------------------------------------------------------------------------------
    b.html
    <body>
    <input type="button" value="ok" onclick="alert(top.aa.body.document.outerHTML);">
    </body>打开a.html后,会加载百度和b.html,点击b.html的按钮,如果没有跨域访问的限制,则会显示a的网页内容,否则就会提示没有权限。
      

  6.   


    让我们共同研究研究。
    我认为此处实际上应该重载GetZoneMapping,这样其他函数在读取ZoneMapping信息的时候就会受到相应的影响。
      

  7.   

    我对InternetSecurityManager这个接口很不放心,曾经跟踪测试过很多次,几乎全不符合预期。后来我是通过实现IInternetProtocolInfo接口完成的,关注ParseUrl方法和ParseAction参数,成功解决了跨域安全限制的问题。
      

  8.   


    抱歉,b.html我写的时候有个笔误,b.html的内容应该是
    b.html 
    <body> 
    <input type="button" value="ok" onclick="alert(top.aa.document.body.outerHTML);"> 
    </body> 
      

  9.   

    james,你的意思是每次系统查询domain的时候,都返回一个固定的domain来欺骗系统?这样会不会有隐患?这个函数的使用范围恐怕会很广。不过还是试试先。
      

  10.   

    域名欺骗用mimefilter或者命名空间过滤器就足够了,但是不适合你说的情况,因为域名都是未知的。
      

  11.   


    james,你说的两种办法都试验了,可是都不行,不知道还有没有什么思路?
      

  12.   

    非安全的做法, 不知楼主想干什么?
    FF, IE都不会支持这种行为, 如果成功的话, 对客户端用户就是一种欺骗.
      

  13.   


    是不可能让FF或者IE这么做的,只有定制的浏览器才有可能。
    这是我们自己的客户端需要的功能,这个和欺骗客户没有关系。
      

  14.   

    这其实就是一个技术问题,只有能与不能,没有应不应该,如果这是不好的技术,那么google gear等技术又算什么呢?google可是强调过不作恶的公司啊。就问了这么一个技术问题,平时有点儿小问题都想办法自己克服,也算是自律了,希望高手们给点儿面子。
      

  15.   

    非常感谢jameshooo,项目自然是需要进行下去的,绕过去的解决方案早就有了。
    只不过我觉得这是一个非常值得研究和探讨的东西,希望能够有个让人可以接受的结论。
    我想,遇到问题不细抠,就永远是一个工匠。