当前位置: 首页 > 面试题库 >

JSON劫持仍然是现代浏览器中的问题吗?

贲宜春
2023-03-14
问题内容

我正在使用Backbone.js和Tornado Web服务器。在Backbone中接收收集数据的标准行为是作为JSON数组发送。

另一方面,由于以下漏洞,Tornado的标准行为是不允许JSON Array:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-
vulnerability.aspx

对于我来说,当它确实是一个对象列表时,不必将JSON包装在一个对象中就变得更加自然。

我无法在现代浏览器(即当前的Chrome,Firefox,Safari和IE9)中重现这些攻击。同时,我无法证实现代浏览器已经解决了这些问题。

为确保我不会因任何可能的编程技巧或谷歌搜索技巧而误导我:

这些JSON劫持攻击是否在当今的浏览器中仍然是一个问题?

但由于接受的答案似乎无法回答问题-我认为是时候再次提出问题并获得一些更清晰的解释)


问题答案:

不,不再可能捕获在Firefox 21,Chrome 27或IE10中传递给[]{}构造函数的值。

var capture = function() {

    var ta = document.querySelector('textarea')

    ta.innerHTML = '';

    ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));

    return arguments;

}

var original = Array;



var toggle = document.body.querySelector('input[type="checkbox"]');

var toggleCapture = function() {

    var isOn = toggle.checked;

    window.Array = isOn ? capture : original;

    if (isOn) {

        Object.defineProperty(Object.prototype, 'foo', {set: capture});

    } else {

        delete Object.prototype.foo;

    }

};

toggle.addEventListener('click', toggleCapture);

toggleCapture();



[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {

    el.addEventListener('click', function() {

        document.querySelector('textarea').innerHTML = 'Safe.';

        eval(this.value);

    });

});


<div><label><input type="checkbox" checked="checked"> Capture</label></div>

<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>

<div><textarea></textarea></div>

它重写window.Array和添加一个setter,Object.prototype.foo并通过短格式和长格式测试初始化​​数组和对象。

的ES4规范,在第1.5节,“需要的对象和阵列的全球性的,标准绑定到被用于构建用于对象和数组的初始化新对象”在实施先例与指出,“InternetExplorer6中,歌剧9.20,和Safari3执行不尊重Object和Array的本地或全局重新绑定,而是使用原始的Object和Array构造函数。”这在ES5第11.1.4节中保留。

Allen Wirfs-Brock解释说,ES5还指定对象初始化不应触发设置方法,因为它使用DefineOwnProperty。MDN:使用对象指出:“从JavaScript1.8.1开始,在对象和数组初始化程序中设置属性时,不再调用setter。”



 类似资料:
  • 问题内容: 我想检查浏览器是否仍然存在,如果不存在,那么我想打开一个新的浏览器!网络驱动程序中是否有可用的api来检查浏览器是否仍然存在? 问题答案: 调用后,将driver的值设置为 但是,如果调用,它将驱动程序的值设置为 因此,如果您在调用 driver.quit() 之后检查浏览器窗口,则可以通过以下实现知道。

  • 本文向大家介绍javascript检查浏览器是否支持flash的实现代码,包括了javascript检查浏览器是否支持flash的实现代码的使用技巧和注意事项,需要的朋友参考一下 javascript检查浏览器是否支持flash,程序输出结果:

  • 问题内容: 我已经使用flask建立了一个网站(www.csppdb.com)。有时,当我以一个用户身份登录时,先注销,然后以另一个用户身份登录,我仍然会看到以第一个用户身份登录的页面。刷新页面后,立即解决此问题。如果我没记错的话,我认为这被称为“缓存”。有什么办法可以在站点范围内禁用此功能,以便访问的每个页面都需要重新刷新? 这就像与朋友共享您的计算机。他登录Facebook,然后注销。现在,您

  • 问题内容: 我已经看到了一些浏览器的参考,这些浏览器本来就通过Object 安全,有效地支持JSON解析/对象序列化,但细节难以掌握。谁能指出正确的方向?该对象公开哪些方法?它支持哪些浏览器? 问题答案: 所有现代浏览器均支持本地JSON编码/解码(Internet Explorer 8 +,Firefox 3.1 +,Safari 4+和Chrome 3+)。基本上,将解析JSON字符串并返回一

  • 问题内容: 任何人都可以告诉如何维护会话(使用PHP),以便即使重新启动浏览器后也可以保留会话中包含的内容并且可以访问该会话。 通常,会话会随着浏览器的关闭而过期,但是我希望不要关闭该会话,以便下次使用浏览器时可以访问该会话数据。 问题答案: 用于在启动会话之前为会话cookie提供非零的生存期,或设置为非零。

  • 我有一个使用assetic的Symfony2应用程序。一切都很好,只是在localhost中,浏览器不会缓存我的资产。 任何想法,为什么以下资产没有得到缓存响应304和毫秒,而是与200响应,需要大约15秒... 响应头 Accep-Ranges bytes Cache-Control max-age=604800 Connection Keve-Alive Content-Encode gzip