【问题标题】:Safe usage of eval() on server-sent JavaScript code在服务器发送的 JavaScript 代码上安全使用 eval()
【发布时间】:2012-05-08 09:53:50
【问题描述】:

我正在使用 Node.js 和 Socket.io。我编写了一个应用程序,它可以从服务器发送 JavaScript sn-ps 并在客户端执行它们。 JavaScript 通过 Secure WebSocket (WSS) 发送,客户端有一个监听器,它将执行通过服务器传递给它的任何代码。

这个简短的脚本演示了原理:http://jsfiddle.net/KMURe/,您可以将 onScript 函数视为套接字侦听器。

问题

我可以采用哪些安全协议来确保此交易的安全?安全的 websocket 通道是否会使第三方难以充当中间人(在将代码发送到客户端之前更改代码)?

一些用例..

  • 动态分配的分布式计算。
  • 浏览器客户端可以动态向服务器学习。
  • 统一更新浏览器行为。

【问题讨论】:

  • 我不明白为什么它会比 HTTPS 更安全,但它似乎是一个奇怪的设计。你不能预先加载所有的客户端脚本,让服务器只发送一个函数的名称来调用吗?
  • 是的,这是一个有效点。这主要是一个实验性的想法,我发现它是一个有趣的话题......可能允许网络服务器发送它喜欢的代码,并让客户端从这个代码中学习。我认为服务器是老师,客户端是学生。
  • 这听起来很有趣。听起来服务器将根据客户端的响应方式决定下一步要做什么,因此可能存在一些特定于您的问题域的安全问题,具体取决于具体内容,但我认为没有像 MITM 攻击那样......协议应该处理这个问题。

标签: javascript node.js websocket


【解决方案1】:

eval(),即使你合法使用,也只是危险。您应该不惜一切代价避免使用它。小心使用它。

但是,如果确实需要,您可以通过"use strict" command 使用严格模式。当eval() is executed in a strict function 时,eval 的内容不会在直接作用域内泄漏。 eval 中的代码将是 contained in eval() 本身(就好像它有自己的范围一样)。 In the demo,尝试删除尾随 xeval() 将返回 undefined

但是,使用eval() 仍然很危险。最好找到像 JSON 这样的替代方案,其中包含将在客户端解析的自定义字符串命令。

【讨论】:

  • 讽刺的是,在旧浏览器中使用 JSON... 需要使用 eval()
  • @Kolink 被视为其合法用途之一
  • 有些人会不同意(不是我个人,只是其他人),因为您可以手动解析 JSON,从而不需要 eval
  • eval 的邪恶被高估了。它在早期被标记为邪恶,因为它被不恰当地用于评估表达式中的字符串(以及许多其他事情),而这根本不是必需的。 JSON、Function called as a function 等都或多或少等同于eval,只需使用正确的工具即可。
  • 据我了解,当存在恶意代码注入的可能性时,eval() 是不安全的。我想通过使用安全的套接字通道来防止这种恶意注入,我还将确保从客户端发送到服务器的任何内容都经过清理。这是否完全消除了评估中的邪恶? (请原谅双关语):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多