【发布时间】:2020-04-22 16:32:34
【问题描述】:
我目前正在开发一个遗留应用程序,其中数据库调用分散在各处。每次执行某种 DML 时,我都需要执行一些与安全(业务)相关的逻辑。为此,我正在考虑使用 java 代理并拦截调用并随后执行业务逻辑。 问题是该代理需要保护,我需要确保无法加载使用相似但不同逻辑开发的不同代理。 应用程序和 java 代理之间是否存在任何可能的相互身份验证,以确保无法加载错误的代理
【问题讨论】:
标签: java javaagents
我目前正在开发一个遗留应用程序,其中数据库调用分散在各处。每次执行某种 DML 时,我都需要执行一些与安全(业务)相关的逻辑。为此,我正在考虑使用 java 代理并拦截调用并随后执行业务逻辑。 问题是该代理需要保护,我需要确保无法加载使用相似但不同逻辑开发的不同代理。 应用程序和 java 代理之间是否存在任何可能的相互身份验证,以确保无法加载错误的代理
【问题讨论】:
标签: java javaagents
应用程序和 java 代理之间是否存在任何可能的相互身份验证,以确保无法加载错误的代理。
没有。应用程序(几乎)不了解代理。当然,应用程序无法正确验证代理。
我想,您可以设计一个“协议”,其中应用程序仅在代理以特定方式调用特定应用程序方法时才有效。但是,可以通过对应用程序或真实代理进行逆向工程来规避这种情况,并使用该知识编写一个模仿所需行为的不良代理。
但我认为你的做法是错误的。有许多更好(更简单、更简洁、更高效)的方法可以将行为注入 Java 应用程序。而且我想我可以发现您的部分动机是您希望尽可能少地修改遗留应用程序。这就是您采用复杂的基于代理的方法的主要动机。
(我对此的反应是,您可能会在代理方面花费更多的精力,而不是通过不修改旧版应用程序来节省。结果将更难维护。)
我还怀疑您对应用程序和拦截器(无论它们是如何实现的)的相互身份验证的要求并不是真正必要的。使用代理的结果,而不是基本要求。
如果我这样做并且我担心防止(内部)试图破坏业务规则,我会:
【讨论】:
Java 附加 API 已经以代理必须的方式得到保护:
要确定这两种情况,您必须拥有可以升级到超出 JVM 进程中运行的代理权限的权限。由于这些原因,没有必要从 JVM 中验证您的代理。
理论上,您可以编写一个检测检测 API 的 Java 代理,并确保首先附加该代理。例如,检测 API 的检测可以在附加代理之前检查附加代理的 jar 文件,并将其与某些已知种子进行比较。如果此种子不匹配,您可能会导致代理初始化失败。
【讨论】: