问题 当网页和ajax调用来自同一台服务器时,JSON.parse()是否比eval()更安全?


我知道JSON.parse()可以防止攻击者将javascript注入到响应中,因为JSON解析器只是一个文本解析器,而不是脚本解析器所以请不要关闭这个是关于所有其他问题的重复。这是一个不同的问题。

如果攻击者可以劫持你的Ajax调用并将javascript放入Ajax调用,那么他们是否有可能劫持你的实际网页并将任意javascript放入你可以完成同样攻击的页面?

当然,通过使用JSON.parse()而不是eval(),你没有什么可失去的(除非你的环境中还没有JSON解析器,并且必须添加更多代码才能获得),但它确实是什么情况呢?如果您的网页由与ajax呼叫相同的主机提供服务,请增加安全性吗?


6347
2017-07-20 16:16


起源

我想知道这是否属于 IT安全StackExchange? - George Bailey
我把它放在这里是因为这是每个发布使用eval()的代码的人都会对它的不安全性感到不满。 - jfriend00


答案:


是的,这真的更安全。 您不采取的每项预防措施都是一组您无法阻止的潜在攻击。

攻击者可能无法控制服务器的输出而无法完全更改它。没有人认为它是一个神奇的子弹,但它可能更快,你不会创造一个潜在的漏洞,可能会回来并伤害你。

也许运行你的服务器的人有一个糟糕的一天,并做一些愚蠢的事情,如通过连接未经过验证的用户输入构建JSON:

<?php
    print '{"foo": ' . $_GET['bar'] . '}';
?>

如果你正在使用 JSON.parse他们能做的最糟糕的事情就是把一个大物体塞进你的记忆中。如果你正在使用 eval 他们可以劫持一切。


9
2017-07-20 16:22



+1用于提供如何的示例 JSON.parse 鉴于OP的原始规格,确实更安全。 - George Bailey
@jfriend00这是一个有点人为的例子,但似乎大多数时候网站被黑了,它涉及这样的愚蠢;这不完全是不现实的。你似乎对过分强调这一点的人感到困扰。我承认这不是世界上最大的问题,但它在某些情况下有所帮助,没有理由不这样做。 - Jeremy Banks
只是在这里亵渎使用eval并且强调程度似乎与它所帮助的方式不成比例。如果你担心黑客攻击,使用https来抵御中间人攻击似乎更为重要,这种攻击可以为注入你的核心网页增加一些保护,但这几乎没有提到过。我不反对JSON.parse(),只是它似乎强调的不仅仅是安全预防措施,它会带来更多的好处。 - jfriend00
@jfriend00我同意Jeremy的第二条评论。虽然这是一个人为的例子,但这并不是不现实的。有很多方法可以通过webapp注入内容。我使用if语句在可用时调用JSON.parse。 - George Bailey
@ jfriend00另外,我理解你的沮丧。 我问了一个问题 在不到2个小时的时间里,有15条关于分号的评论,第二天更多。 (那些碰到的人,请不要继续评论)我想不出如何减少这些所谓的“圣战”,除了Jeff Atwood或Jon Skeet的博客文章,我们可以指出人们。现在我只是忽略那些类型的参数,除非我能小心翼翼地结束它们。 - George Bailey


好吧,如果他们能够注入你的AJAX响应,他们可能已经成功地以某种方式让你中间(ARP,DNS或其他)。

看到 http://en.wikipedia.org/wiki/Man-in-the-middle_attack 有关这些类型的攻击的更多详细信息。

你是正确的,如果他们可以注入你的AJAX响应,他们也可以注入整个页面。实际上,除非使用HTTPS \ SSL之类的东西,否则您收到的任何内容或通过网络发送的内容现在都会在MitM中受到攻击。


2
2017-07-20 16:21





这是一个非常好的观点。我唯一能想到的就是那个 JSON.parse 会有更快的机会 eval

如果浏览器已经缓存了HTML / JavaScript且服务器使用了,则不太可能的优势 Cache-Control 说它不需要重新加载。如果发生这种情况,那么当然拦截的人将没有机会修改页面。但这是一种非常罕见的情况。有可能,您将需要浏览器检查HTML / JavaScript的较新版本,这是默认行为。

至于安全性差异,我认为你是对的。

至于我自己,我只使用HTTPS确认的系统。但我有一个使用的功能 JSON.parse 如果可以的话又会重新开始 eval 只是为了提高速度。


1
2017-07-20 16:21





嗯......我不是在提倡使用 eval,但我认为这不构成安全问题 在Javascript中,因为Javascript是客户端语言。如果你不使用 eval 在你的代码中,是什么阻止我运行 javascript:my_own_evil_code() 在控制台或地址栏?它是Javascript,我可以运行自己的代码或修改你的代码,创建我自己的HTTP请求,并做任何HTTP响应,甚至添加我自己的 eval 你的功能。

你不应该使用 eval 如果有另一种类似的解决方案可用,但如果你只是为了简单,就想做 eval('('+jsonstring+')') 模仿 JSON.parse,我不认为这是一个大错误。


0
2017-07-20 16:45



这与用户在自己的页面中运行代码无关。这是关于外部攻击者将代码注入您的页面。所以...地址栏示例并不是真正的意义所在。有各种各样的工具(如GreaseMonkey),它的唯一目的是帮助您在自己的页面中运行额外的代码。允许用户这样做。 - jfriend00
@ jfriend00请更具体一点。如果攻击者能够注入一些代码,那么它已经是一个巨大的安全漏洞,无论是否存在 eval在源头与否。例如,如果攻击者可以修改由创建的HTTP请求的响应 XMLHttpRequest,他还可以修改主文件(w / Javascript),从而运行自己的代码。我几乎可以肯定,如果你告诉我任何使用的情况 eval 为了运行攻击者的代码,我还将告诉你如何不用它 eval。 - duri
这也是我的观点。由于大多数能够修改ajax响应的攻击可能刚刚修改了主页(直接将自己的JS注入其中),保护ajax响应并不会给你带来太大的影响。当所有其他门只有单锁时,在一扇门上放一把双锁并不能为你提供额外的保护,特别是当窗户不太安全时。 - jfriend00