java - 从 String 安全地执行 Java 代码

标签 java

我有一个 Java 后端系统,用于处理客户端发送的 JSON 信息。为了确定应该进行哪种处理,我在 JSON 中使用了一个名为“type”的字段

我的后端系统检查“类型”并根据该类型执行特定的Java代码。

我感兴趣的是探索从外部数据库运行代码的方法,而不是检查类型并执行硬编码到我的 Java 类中的代码。这样,当我想要创建更多“类型”时,我可以简单地添加处理数据库中每种类型的方法,而不必将新的检查或类硬编码到我的 Java 文件中并重新编译/部署。

我读过这篇 StackOverFlow 帖子:Convert String to Code ,但正如评论指出的那样,运行任意代码会带来重大风险。

理想情况下,我希望有一些从外部加载的 Java 方法,该方法具有 JSON 数据的参数,然后它进行自己的检查和处理并返回一个值。

有什么安全(有点)简单的方法来做到这一点吗?也许将字符串解析为java代码不是正确的想法(也许做一些外部类加载会更聪明),但我想问是否有人有关于如何做到这一点的任何想法。

最佳答案

如果要执行的代码很短(一行左右),您可以将其作为键值对存储在程序的配置中,其中键是在 JSON 消息中找到的类型,值是要执行的代码。使用 Groovy 编译单行代码,然后就完成了。

如果要执行的代码较长,则定义一个接口(interface)并创建多个实现。在配置中,将 JSON 中的类型与类相关联。实例化具有已知名称的类只需 Class.forName(...).newInstance() 加上错误处理。这还可以让您创建插件 - 只需将一个新的实现类放入您的类路径中,在配置中添加条目并重新启动应用程序即可。您可能可以使用 Spring 和 beans 来完成此操作,但对于简单的情况,手动执行可能更容易、更快。

这些解决方案是安全的,因为我们假设恶意用户无法更改您的配置或 JAR(否则您已经陷入大麻烦了)。

关于java - 从 String 安全地执行 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622903/

相关文章:

java - ServerBuilder.forPort(端口) - java.lang.NoSuchMethodError

java - 希望使用简单的规则 api 构建 java 动态规则引擎

Java反射抓取一个非公共(public)领域

java - 这两个sql语句(JDBC)有什么区别?

java - Hadoop。如何从 Mapper 获得工作

java - 如何使用java从文本文件中删除重复的单词

java - 在 Java JSch Shell 中获得两次 shell 提示符

java - rabbitMQ 读取一个值也会从队列中刷新其他值

java - 如何在BoxLayout中的JButton之间添加垂直空间?

Java 编码器性能