【问题标题】:Bypassing a browser security limitation on my own computer绕过我自己计算机上的浏览器安全限制
【发布时间】:2012-08-21 22:53:41
【问题描述】:

我正在尝试通过它们的前缀(en、fr、es、...)在维基百科。为此,我编写了一个可以在 this page 上执行的 JS 代码,并将数据存储在一个变量中。该代码打开每个维基百科的主页并尝试根据其<html> 元素的'dir' 属性检查语言的方向。但是,由于每个 Wikipedia 都有不同的域,出于安全原因,浏览器不会让我访问这些数据。有没有这样的浏览器?是否可以更改我的偏好以启用它?

附:代码:

var as = document.querySelectorAll('a.extiw'), pre, win, dirByPre = {};
for each (var a in as)
   if (pre = /^http:\/\/(\w+)\.wikipedia\.org\/wiki\/$/.exec(a.href)) {
      win = open(pre[0]);
      win.onload = function () {
         opener.dirByPre[pre[1]] = document.documentElement.dir;
         close();
      };
   }

非常感谢!

【问题讨论】:

    标签: javascript security code-access-security


    【解决方案1】:

    您遇到的是访问控制允许来源错误。阅读它,Access Control Allow Origin not allowed by

    一般来说,如果你想访问另一个页面的数据以在 JS 中使用,你需要在你自己的服务器上这样做,并将其传递给 Javascript。

    但是,在这种情况下,最好的解决方案是通过其 API 访问 Wikipedia 并请求 JSONP 响应。请记住,维基百科是建立在 MediaWiki 之上的,因此请参阅它的 API Docs http://www.mediawiki.org/wiki/API:Main_page

    title = "List_of_Wikipedias"; 
    
    $.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data) {
        console.log(data);
    })
    

    注意“format=json”和“callback=?”

    这种 JSONP 方法适用于所有现代浏览器。

    【讨论】:

      【解决方案2】:

      现代浏览器通常不允许这样做是有原因的。当允许任意 JavaScript 访问其他域时,存在许多安全问题。一个例子是XSS (cross-site scripting)

      如果您不尝试在浏览器内部运行您的脚本,那么您尝试做的事情会容易得多。 Python、Ruby 或任何其他脚本语言确实可以使用单独的 HTTP 请求轻松完成此操作。如果你知道 JavaScript,Node.JS 怎么样?

      【讨论】:

        【解决方案3】:

        这可能是一个奇怪的解决方案,但您可以编写一个浏览器扩展来允许您发出跨域请求。有一些简单的方法可以开发扩展,例如 Crossrider,它有一个 X-Domain addon,允许您通过 Javascript 发出跨域请求。

        【讨论】:

          猜你喜欢
          • 2017-05-28
          • 1970-01-01
          • 2018-04-17
          • 2021-08-20
          • 2013-08-13
          • 2018-04-20
          • 1970-01-01
          • 2012-05-22
          • 1970-01-01
          相关资源
          最近更新 更多