如何保护允许用户插入JavaScript的应用?

时间:2016-08-03 15:10:56

标签: javascript security

我们的应用程序位于防火墙后面,位于CAS身份验证层后面。它具有一个功能,允许具有特殊角色的用户通过编写在运行时插入应用程序的JavaScript函数来自定义应用程序的工作方式,并且可以通过按钮单击和页面加载等事件触发。 (JS不是“eval”' - 它被写入页面服务器端。)

毋庸置疑,此功能引发了安全问题!

除了a)防火墙,b)强大的身份验证和c)授权之外,是否有建议超出已经完成的工作。

编辑: 回答评论中的问题: 1.注入的代码是否成为应用程序的一部分,还是作为独立的应用程序(分离的上下文)执行? 是的,它成为应用程序的一部分。它目前在服务器端插入到脚本标记中。

  1. 插入的JavaScript是否在原始编写者以外的客户端浏览器上运行? 是。它会被持久化,然后插入到将来的所有请求中。
  2. (该应用程序可以被认为是一个“引擎”,用于构建针对RESTful调用访问的通用后端数据存储的自定义应用程序。每个自定义应用程序都可以拥有自己的一组自定义这些JavaScripts)

1 个答案:

答案 0 :(得分:3)

你真的不应该只接受任意的JavaScript。理想情况下,你应该对你发送的任何JavaScript进行标记,并确保每个令牌都是有效的JavaScript,这首先应该适用于所有以下情况)。

之后,您应该验证发送的JavaScript无法访问敏感信息。

最后一部分可能非常困难,甚至无法用混淆代码进行验证,您可能需要考虑一下,无论您做多少验证,这都是本质上不安全的做法。只要您了解这一点,以下是一些建议,使这个过程比通常更安全:

  • 作为@FDavidov has mentioned,您还可以限制JavaScript作为应用程序的一部分运行,并将沙箱放在一个单独的上下文中,就像Stack Snippets那样。

  • 另一种选择是将JavaScript限制为预定义的白名单函数(其中一些可能已实现)和全局变量。除了当然原语,控制流和用户定义的函数定义之外,不要让它直接与DOM或全局变量交互。此方法确实取得了一些成功,具体取决于白名单的强制执行方式。 Here is an example that uses this method in combination with the method below

  • 或者,如果您的想法可以实现,请不要让代码在除代码原始作者之外的任何人的机器上运行。这基本上就是将类似Userscript的功能转移到应用程序中(我老实说也看不到这一点),但它肯定比允许它在任何客户端的浏览器上运行更安全。