首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建安全的JEXL(脚本)沙箱?

创建安全的JEXL(Java Expression Language)沙箱是为了在执行JEXL脚本时保护应用程序的安全。以下是一些建议和步骤来创建一个安全的JEXL沙箱:

  1. 使用JEXL引擎的Sandbox功能: JEXL引擎提供了一个名为Sandbox的功能,可以限制脚本在执行过程中访问的资源。要创建一个Sandbox,可以使用以下代码:
代码语言:java
复制
JexlEngine jexl = new JexlEngine();
JexlSandbox sandbox = new JexlSandbox();
jexl.setSandbox(sandbox);
  1. 限制脚本的执行时间: 为了防止恶意脚本导致的潜在性能问题,可以限制脚本的执行时间。可以使用以下代码来实现:
代码语言:java
复制
jexl.setExecutionLimit(100); // 设置脚本执行时间限制为100毫秒
  1. 限制脚本的内存使用: 为了防止恶意脚本导致的内存溢出问题,可以限制脚本的内存使用。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMemoryLimit(1024 * 1024); // 设置脚本内存使用限制为1MB
  1. 限制脚本的堆栈深度: 为了防止恶意脚本导致的堆栈溢出问题,可以限制脚本的堆栈深度。可以使用以下代码来实现:
代码语言:java
复制
jexl.setStackOverflowLimit(100); // 设置脚本堆栈深度限制为100
  1. 限制脚本的变量数量: 为了防止恶意脚本导致的变量数量过多的问题,可以限制脚本的变量数量。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumVariableCount(1000); // 设置脚本变量数量限制为1000个
  1. 限制脚本的函数数量: 为了防止恶意脚本导致的函数数量过多的问题,可以限制脚本的函数数量。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumFunctions(100); // 设置脚本函数数量限制为100个
  1. 限制脚本的操作符数量: 为了防止恶意脚本导致的操作符数量过多的问题,可以限制脚本的操作符数量。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumOperators(1000); // 设置脚本操作符数量限制为1000个
  1. 限制脚本的引用深度: 为了防止恶意脚本导致的引用深度过多的问题,可以限制脚本的引用深度。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumReferenceDepth(10); // 设置脚本引用深度限制为10层
  1. 限制脚本的属性深度: 为了防止恶意脚本导致的属性深度过多的问题,可以限制脚本的属性深度。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumPropertyAccess(10); // 设置脚本属性深度限制为10层
  1. 限制脚本的数组大小: 为了防止恶意脚本导致的数组大小过大的问题,可以限制脚本的数组大小。可以使用以下代码来实现:
代码语言:java
复制
jexl.setMaximumArraySize(1000); // 设置脚本数组大小限制为1000个元素

通过以上步骤,可以创建一个安全的JEXL沙箱,保护应用程序的安全。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Apache Commons工具集类库简单说明和使用

    1.2.简介 Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问 http://jakarta.apache.org/commons/index.html  BeanUtils  Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt  Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain  Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI  CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec  Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder. Collections  Commons-Collections 提供一个类包来扩展和增加标准的 Java Collection框架 Configuration  Commons-Configuration 工具对各种各式的配置和参考文件提供读取帮助. Daemon  一种 unix-daemon-like java 代码的替代机制 DBCP  Commons-DBCP 提供数据库连接池服务 DbUtils  DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester  Commons-Digester 是一个 XML-Java对象的映射工具,用于解析 XML配置文件. Discovery  Commons-Discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。. EL  Commons-EL 提供在JSP2.0规范中定义的EL表达式的解释器. FileUpload  FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力 HttpClient  Commons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架. IO  IO 是一个 I/O 工具集 Jelly  Jelly是一个基于 XML 的脚本和处理引擎。 Jelly 借鉴了 JSP 定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly 可以用在命令行, Ant 或者 Servlet之中。 Jexl  Jexl是一个表达式语言,通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。. JXPath  Commons-JXPath 提供了使用Xpath语法操纵符合Java类命名规范的 JavaBeans的工具。也支持 maps, DOM 和其他对象模型。. Lang  Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka  Commons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试. Launcher  Launcher 组件是一个交叉平台的Java 应用载入器。Commons-launcher 消除了需要批处理或者Shell脚本来载入Java 类。.原始的 Java 类来自于Jakarta Tomcat 4.0 项目 Logging  Commons-Logging 是一个各种 logging API实现的包裹类. Math  Math 是一个轻量的,自包含的数学和统计组件,解决了许多非常通用但没有及时出现在Java标准语言中的实践问题. Modeler  Commons-Modeler 提供了建模兼容JMX规范的Mbean的机制. Net  Net 是一个网络工具集,基于 NetComponents 代码,包括 FTP 客户端等等。 Pool  Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. Primitives  Commons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 collection。. Validator  The commons-validator提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则。支持校验规则的和错误消息的国际化。

    01

    Nexus Repository Manager 3 几次表达式解析漏洞

    Nexus Repository Manager 3最近曝出两个el表达式解析漏洞,编号为CVE-2020-10199[1],CVE-2020-10204[2],都是由Github Secutiry Lab团队的@pwntester发现。由于之前Nexus3的漏洞没有去跟踪,所以当时diff得很头疼,并且Nexus3 bug与安全修复都是混在一起,更不容易猜到哪个可能是漏洞位置了。后面与@r00t4dm师傅一起复现出了CVE-2020-10204[3],CVE-2020-10204[4]是CVE-2018-16621[5]的绕过,之后又有师傅弄出了CVE-2020-10199[6],这三个漏洞的根源是一样的,其实并不止这三处,官方可能已经修复了好几处这样的漏洞,由于历史不太好追溯回去,所以加了可能,通过后面的分析,就能看到了。还有之前的CVE-2019-7238[7],这是一个jexl表达式解析,一并在这里分析下,以及对它的修复问题,之前看到有的分析文章说这个漏洞是加了个权限来修复,可能那时是真的只加了个权限吧,不过我测试用的较新的版本,加了权限貌似也没用,在Nexus3高版本已经使用了jexl白名单的沙箱。

    01

    (译)为容器提供更好的隔离:沙箱容器技术概览

    既然主流 IT 工业都在采用基于容器的基础设施(云原生方案),那么了解这一技术的短板就很重要了。Docker、LXC 以及 RKT 等传统容器都是共享主机操作系统核心的,因此不能称之为真正的沙箱。这些技术的资源利用率很高,但是受攻击面积和潜在的攻击影响都很大,在多租户的云环境中,不同客户的容器会被同样的进行编排,这种威胁就尤其明显。主机操作系统在为每个容器创建虚拟的用户空间时,不同容器之间的隔离是很薄弱的,这是造成上述问题的根本原因。基于这样的现状,真正的沙箱式容器,成为很多研发工作的焦点。多数方案都对容器之间的边界进行了重新架构,以增强隔离。本文覆盖了四个项目,分别来自于 IBM、Google、Amazon 以及 OpenStack,几个方案的目标是一致的:为容器提供更强的隔离。IBM Nabla 在 Unikernel 的基础上构建容器;Google 的 gVisor 为运行的容器创建一个特定的内核;Amazon 的 Firecracker 是一个超轻量级的沙箱应用管理程序;OpenStack 将容器置入特定的为容器编排平台优化的虚拟机之中。下面对几个方案的概述,有助于读者应对即将到来的转型机会。

    03

    再谈沙箱:前端所涉及的沙箱细讲

    沙箱或称沙盒,即sandbox,顾名思义,就是让程序跑在一个隔离的环境下,不对外界的其他程序造成影响,外界无法修改该环境内任何信息,沙箱内的东西单独属于一个世界,通过创建类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。举个简单的栗子,其实我们的浏览器,Chrome 中的每一个标签页都是一个沙箱(sandbox)。渲染进程被沙箱(Sandbox)隔离,网页 web 代码内容必须通过 IPC 通道才能与浏览器内核进程通信,通信过程会进行安全的检查。沙箱设计的目的是为了让不可信的代码运行在一定的环境中,从而限制这些代码访问隔离区之外的资源。

    01

    被低估的 Deno

    这个周末,我一直在把玩 deno 的 rusty_v8 以及 deno_core(录了几个 rusty_v8 的视频,预计四月第二周发)。rusty_v8 是 google v8 engine 的 Rust 零成本封装,而 deno_core 在 rusty_v8 的基础上进一步封装了一些额外的功能。众所周知,v8 是 chrome 内部的 javascript 执行引擎,它优异的 JIT 能力,以及高效的垃圾回收,使得 chrome 成为最快最成功的浏览器。v8 仅仅被用在浏览器中有些暴殄天物,于是十多年前(2009),Ryan Dahl 把 v8 引入了服务端,创建了 node.js —— node 以简单容易上手的编程模型(单线程,异步处理)和大量的前端拥趸一举成为广受欢迎的服务端开发工具;而 3 年前,Ryan Dahl 自我革命,重新用 v8 从零打造 deno,意欲让 deno 成为下一代服务器开发的王者。

    03
    领券