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

人们为什么要输入“ throw 1; ”和“ for(;;);” 在json响应前面?

微生智刚
2023-03-14
问题内容

Google返回json,如下所示:

throw 1; <dont be evil> { foo: bar}

和Facebook的ajax具有这样的json:

for(;;); {"error":0,"errorSummary": ""}
  • 他们为什么放置将停止执行并生成无效json的代码?
  • 如果它无效,他们将如何解析它;如果您尝试评估它,它将崩溃吗?
  • 他们只是将其从字符串中删除(似乎很昂贵)吗?
  • 这有什么安全优势吗?

出于安全考虑,对此:

如果刮板在另一个域上,则它们将不得不使用script标签来获取数据,因为XHR无法跨域工作。即使没有,for(;;);攻击者也将如何获取数据?它没有分配给变量,所以不会因为没有引用而被垃圾回收吗?

基本上要获得跨域数据,他们必须要做

<script src="http://target.com/json.js"></script>

但是,即使没有预先添加崩溃脚本,攻击者也无法使用任何Json数据,除非将其分配给可以全局访问的变量(在这些情况下不是)。崩溃代码实际上无能为力,因为即使没有崩溃代码,他们也必须使用服务器端脚本来使用其站点上的数据。


问题答案:

即使没有,for(;;);攻击者也将如何获取数据?

攻击是基于改变行为的内置类型,特别是ObjectArray,通过改变它们的构造函数或其prototype。然后,当目标JSON使用{...}[...]构造时,它们将成为攻击者自己的那些对象版本,并且具有潜在的意外行为。

例如,您可以将setter-property侵入Object,这会出卖以对象常量编写的值:

    Object.prototype.__defineSetter__('x', function(x) {
        alert('Ha! I steal '+x);
    });

然后,当将a <script>指向使用该属性名称的JSON时:

{"x": "hello"}

该值"hello"将被泄漏。

数组和对象文字导致setter的调用方式是有争议的。Firefox删除了3.5版中的行为,以响应对备受瞩目的网站的公开攻击。但是,在撰写本文时,Safari(4)和Chrome(5)仍然容易受到此攻击。

所有浏览器现在禁止的另一种攻击是重新定义构造函数:

    Array= function() {
        alert('I steal '+this);
    };

    [1, 2, 3]

目前,IE8的属性实现(基于ECMAScriptFifthEdition标准和Object.defineProperty)目前在Object.prototype或上不起作用Array.prototype

但是,除了保护过去的浏览器外,JavaScript的扩展可能会在将来引起更多类似的潜在泄漏,在这种情况下,谷壳应该也防止此类泄漏。



 类似资料:
  • 问题内容: Google会像这样返回json: 和Facebook的ajax具有这样的json: 他们为什么放置将停止执行并生成无效json的代码? 如果它无效,他们将如何解析它;如果您尝试评估它,它将崩溃吗? 他们只是将其从字符串中删除(似乎很昂贵)吗? 这有什么安全优势吗? 出于安全考虑,对此: 如果刮板在另一个域上,则它们将不得不使用标签来获取数据,因为XHR无法跨域工作。即使没有,攻击者也

  • 我的一位同事最近在eclipse中创建了一个新项目,并使用内置的git客户端提交和推送。在我克隆到计算机并用eclipse打开后,我发现eclipse正在创建.classpath文件。CLASSPATH不是eclipse项目(也是.project)查找引用的JAR的关键文件吗?我在谷歌后非常困惑,看到所有的讨论都在谈论忽略他们。难道它们不是Eclipse正确工作的关键吗?为什么人们忽视了他们?如果

  • 问题内容: 当引用类变量时,为什么人们要在它前面加上?我不是在谈论什么时候用于区分方法参数,而是在看起来没有必要的时候。 例: 在其中,为什么不仅仅引用为? 什么买什么? 这是一个其代码已在前面的stackoverflow问题。 问题答案: 某些人喜欢在私有数据成员之前添加“ m_”或名称接口“ IFoo”的原因相同。他们认为它提高了可读性和清晰度。您是否同意这样的约定是一个品味问题。

  • 问题内容: 我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。 我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。 但是无法确定为什么执行后服务器响应为JSON格式: 我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为

  • 问题内容: 为什么Google会优先使用其(私有)JSON响应? 例如,这是在Google日历中打开和关闭日历时的响应: 我认为这是为了防止人们对此进行操作,但是您真正要做的就是替换,然后进行设置。我认为评估是为了确保人们编写安全的JSON解析代码。 我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,Google Docs 以开头,而Google

  • 问题内容: 如果你碰巧有 在程序(或模块)的中间,您将得到警告: 我理解为什么通常不鼓励这样做(命名空间不可见),但是在很多情况下,这样做很方便,尤其是在不与任何人共享代码的情况下。 那么,谁能准确地详细解释为什么在所有可能的情况下都应禁止这样做? 问题答案: 我相信通过“在您的程序中间”,您正在谈论函数定义 内 的导入: 不允许这样做,因为这会使优化函数主体过于困难。Python实现希望在对函数