繁体   English   中英

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

[英]Is JSON.parse() really safer than eval() when web page and ajax call come from same server?

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

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

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

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

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

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

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

如果你正在使用JSON.parse ,他们能做的最糟糕的事情就是将一个大对象推入你的记忆中。 如果你使用eval他们可以劫持一切。

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

有关这些类型的攻击的详细信息,请参见http://en.wikipedia.org/wiki/Man-in-the-middle_attack

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

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

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

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

至于我自己,我只使用HTTPS确认的系统。 但是我有一个使用JSON.parse的函数(如果可用)并且仅仅为了提高速度而退回到eval

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM