我正在为JEXL脚本创建一个沙箱,以便恶意用户无法访问我们允许其访问的变量之外的数据,也无法在服务器上执行DOS攻击。我想为其他人也记录这一点,并让其他人对此方法提出意见。如何创建安全的JEXL(脚本)沙箱?
以下是需要解决的,我知道了事情的清单:
- 只允许使用“新”是在白名单上实例化类。
- 不允许访问任何类的getClass方法,因为可以调用forName并且可以访问任何类。
- 限制对资源(如文件)的访问。
- 只允许执行一段时间的表达式,以便我们可以限制它消耗的资源量。
这并不适用于JEXL,但可以适用于脚本语言,使用的是:
- 不要让一个对象有一个自定义的finalize方法,因为finalize方法从终结线程调用并将使用最初的AccessControlContext而不是用于创建对象并执行其中的代码的执行。