当代码可用时,Javascript中的eval真的有安全风险吗
Are evals in Javascript really a security risk, when the code is available anyway.
当我在当前代码中使用evals时,我最终看到了这个问题。
为什么使用JavaScript eval函数是个坏主意?
当浏览器中有javascript代码时,您可以将javascript作为HTML的一部分或作为单独的文件下载。任何人都可以查看和修改源代码。我看不出通过eval()进行的注入攻击会比破解源代码并根据攻击者的意愿进行更改更糟糕。
有人能解释一下我缺了什么吗?或者在某些情况下,eval是危险的,这不能(轻易)通过更改源代码来实现。
在Javascript注入攻击的情况下,您不必担心浏览器用户提供不受信任的代码。您担心来自其他地方的代码。例如,如果您从第三方网站下载数据,并eval
它,则此代码将在用户页面的上下文中执行,并且可能会对用户的数据做坏事。所以你相信第三方不会向你发送邪恶的JS。
当然,我们经常这样做——我们中的许多人链接到谷歌或微软CDN来获得jQuery和其他库。这些都是知名网站,我们选择信任它们来获得性能优势。但是,随着这些网站变得不那么值得信赖,你必须更加小心,而不仅仅是盲目地执行他们发送给你的任何内容。
在某种程度上,跨站点AJAX规则限制了第三方代码可能造成的损害。这些浏览器更改的发生正是因为XSS攻击正在进行,并向攻击者发送用户私人数据。但是eval
仍然允许某些类型的恶意软件,所以在使用它时必须小心。
即使在您确信要评估的字符串是可信和安全的情况下,也不总是值得使用eval
。
例如,如果你想让你的网页作为应用程序在Mozilla Firefox OS上可用,eval
会破坏它,因为它是被禁止的。有关详细信息,请参阅本页。
同样,根据本文档,简单使用eval
在Google Chrome扩展中也不起作用。
若您对要评估的字符串的安全性不是100%肯定的,则应该完全避免eval
。
让我们从您链接的问题中的土豆示例开始:
eval('document.' + potato + '.style.color = "red"');
假设您在站点中有一个名为potato
的输入字段,当您要求用户选择"正文"或"表单[0]"时,您使用此输入和上面的代码来更改正文或您交付给其他用户的页面上的第一个表单的颜色(例如使用DB)。
现在假设一个适度邪恶的用户将其放入potato
:
"title;alert('test');({style:{color:1}})"
然后发生的是警报。但这种情况可能更糟,比如对服务器的ajax调用提供了页面的机密内容。
正如您所看到的,这与SQL注入是同一类问题。
当然,要做到这一点,你必须非常愚蠢,即使用用户提供的字符串,并将它们放在其他计算机上包含敏感内容的页面上的evaled
字符串中。这就是为什么我认为"eval is evil"
主要是令人讨厌的FUD。
但另一个重要的点是,eval
速度很慢,而且大多数时候都毫无用处,因为您可以获得更好、更清洁、更可维护的解决方案。
Eval不是邪恶的,但它通常是不好的做法。
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 使用javascript存储变量的最安全方式
- 是否存在React Native“;WEB代码安全防护”;
- 内容安全策略:页面's设置阻止加载资源
- 指令加载真的很长,检查加载时间的方法
- 如何通过安全的https连接在javascript中使用基于soap xml的Web服务
- JS,“;对象”;,这个和那个.来自蟒蛇这真的让我很困惑.(双关语)
- 导致内容安全策略(CSP)冲突错误的本地jquery.js文件
- 如何在Google chrome安全首选项文件中创建扩展安全哈希代码
- ES6 模板文字是否比 eval 更安全
- 为什么这是真的:parseInt(1111111111111,2)===parseInt(111111111111,2)
- (false==false==true)怎么可能是真的
- CORS保持在SecurityError上:操作不安全
- 旋转木马;启用内容安全策略时无法工作
- 从自己的安全系统中重新找回自己
- 关于ajax的安全问题
- 在Javascript中构建HTML字符串真的不安全吗?
- 当代码可用时,Javascript中的eval真的有安全风险吗
- javascript eval真的有那么大的安全威胁吗?
- javascript私有变量真的安全吗?