我们的应用程序位于防火墙后面,位于CAS身份验证层后面。它具有一个功能,允许具有特殊角色的用户通过编写在运行时插入应用程序的JavaScript函数来自定义应用程序的工作方式,并且可以通过按钮单击和页面加载等事件触发。 (JS不是“eval”' - 它被写入页面服务器端。)
毋庸置疑,此功能引发了安全问题!
除了a)防火墙,b)强大的身份验证和c)授权之外,是否有建议超出已经完成的工作。
编辑: 回答评论中的问题: 1.注入的代码是否成为应用程序的一部分,还是作为独立的应用程序(分离的上下文)执行? 是的,它成为应用程序的一部分。它目前在服务器端插入到脚本标记中。
(该应用程序可以被认为是一个“引擎”,用于构建针对RESTful调用访问的通用后端数据存储的自定义应用程序。每个自定义应用程序都可以拥有自己的一组自定义这些JavaScripts)
答案 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的功能转移到应用程序中(我老实说也看不到这一点),但它肯定比允许它在任何客户端的浏览器上运行更安全。