首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能提出安全的JSONP请求?

是否有可能提出安全的JSONP请求?
EN

Stack Overflow用户
提问于 2013-05-21 00:07:14
回答 1查看 998关注 0票数 6

我只需要支持新浏览器

我必须依赖外部服务来提供JSONP数据,我不拥有该服务,而且它不允许CORS

我很难相信来自外部服务器的JSONP请求,因为它们可以在我的端运行任意代码,这将允许他们跟踪我的用户,甚至窃取他们的信息。

我想知道是否有任何方法可以创建同样安全的JSONP请求?

(相关:如何可靠地保护公开的JSONP请求?,但与新浏览器松弛无关)

注意:我问/回答了它的问答风格,但我对其他想法非常开放。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-21 00:07:14

是的!

这是可能的。一种方法是使用WebWorkers。运行在WebWorkers中的代码无法访问正在运行的DOM或其他JavaScript代码。

您可以创建一个WebWorker并使用它执行JSONP请求,然后在完成之后终止它。

这个过程是这样的:

  • 使用要请求的URL从blob创建一个WebWorker
  • 使用importScripts加载带有本地回调的JSONP请求
  • 当该回调执行时,将消息发送回脚本,然后脚本将使用数据执行实际的回调消息。

这样,攻击者就不会知道DOM的任何信息。

这是一个样本实现

代码语言:javascript
运行
复制
//   Creates a secure JSONP request using web workers.
//   url - the url to send the request to
//   data - the url parameters to send via querystring
//   callback - a function to execute when done
function jsonp(url, data, callback) {
    //support two parameters
    if (typeof callback === "undefined") {
        callback = data;
        data = {};
    }
    var getParams = ""; // serialize the GET parameters
    for (var i in data) {
        getParams += "&" + i + "=" + data[i];
    }
    //Create a new web worker, the worker posts a message back when the JSONP is done
    var blob = new Blob([
        "var cb=function(val){postMessage(val)};" +
        "importScripts('" + url + "?callback=cb" + getParams + "');"],{ type: "text/javascript" });
    var blobURL = window.URL.createObjectURL(blob);
    var worker = new Worker(blobURL);

    // When you get a message, execute the callback and stop the WebWorker
    worker.onmessage = function (e) {
        callback(e.data);
        worker.terminate();
        };
    worker.postMessage(getParams); // Send the request
    setTimeout(function(){
        worker.terminate();//terminate after 10 seconds in any case.
    },10000);
};

这里是在JSFiddle:中工作的示例用法

代码语言:javascript
运行
复制
jsonp("http://jsfiddle.net/echo/jsonp", {
    "hello": "world"
}, function (response) {
    alert(response.hello);
});

此实现不处理其他一些问题,但它阻止了对页面上DOM或当前JavaScript的所有访问,可以创建一个安全WebWorker环境

这应该适用于IE10+、Chrome、Firefox和Safari以及移动浏览器。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16660145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档