java - 如何使用AOP拦截File、FileReader、FileWriter、FileInputStream、FileOutputStream的构造函数?

标签 java spring aop aspectj

我想拦截 File、FileReader、FileWriter、FileInputStream 和 FileOutputStream 的构造函数,并防止任何文件名包含“..”(以防止路径遍历攻击)或“\0”(以防止文件名空字符攻击)。

关于如何使用 SecurityManager 做同样的事情,我还有另一个悬而未决的问题,但还没有人回答它,所以我希望这种替代方法能奏效。

这是用于 tomcat 上的 spring webapp。

我知道我可以通过创建自己的 SafeFile、SafeFileReader 等类并修改代码以使用它们来手动执行此操作。但是,我们的代码中有 960 个地方使用了这些对象的构造函数,所以我宁愿避免这种情况,除非这是唯一的方法。

最佳答案

即使 Sotirios Delimanolis 链接到这里的答案是正确的(我自己写的),只要 AspectJ 而不是基于代理的 Spring AOP 是必要的,请注意你不能使用 execution(*.new(. .)) 用于 JDK 类,因为这些类在默认情况下被排除在切面编织之外。为了编织到 JDK 类中(执行连接点在逻辑上位于被调用方代码中),您需要修改 JDK 的 rt.jar 或至少将修改后的 JDK 类放在 JDK 本身之前的引导类路径中。这是可能的,但不是那么微不足道。

但是有一个更简单的选择:通过 call(*.new(..)) 编织到调用者(你自己的代码),而不是被调用者 - 注意 call 之间的区别()execution()。这反过来意味着您无法拦截对不是由您自己的编织代码或 JDK 本身发出的 JDK 类的调用。因此,如果您需要一个 100% 的解决方案,即使是对于不在您自己控制之下的代码,您最终也会编织 JDK。如果您只想保护自己的类(class),则可能没有必要。 :-)

尽管我是 AspectJ 的 super 粉丝,但我想强调的是,我也是干净代码和重构的坚定支持者。像 IntelliJ IDEA 或 Eclipse 这样的任何体面的 IDE 都应该使重构 960 调用以使用您建议的安全包装类变得非常简单。如果它如此重要,你为什么不这样做呢? IDEA 的结构搜索和替换可以在几分钟内为您完成,如果不是几秒钟的话。 AOP 可以,但不应该用来修补你自己代码的缺陷。所以请去重构,之后你会更快乐。

关于java - 如何使用AOP拦截File、FileReader、FileWriter、FileInputStream、FileOutputStream的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398260/

相关文章:

java - 当 main 方法包含在类中时,我的程序可以编译,但当 main 方法是单独的时则不能编译

java - 当构建为独立于操作系统的 zip 时,Netbeans RCP 应用程序无法在 IDE 之外工作

java - Aspectj 切入点表达式不适用于单个类中的一种方法,但适用于另一种方法

java - Spring AOP切入点表达式排除注解

java - 从二维数组中提取偶数列的问题

java - android 通知不会按时出现

java - 自定义映射 Spring Data ElasticSearch

java - Spring 5缓存不适用于@Cachable(CacheInterceptor不在调用堆栈中)?

java - 在java中向服务器发送请求后不等待响应

java - JobRunr 与 Spring Boot - ConverterNotFound 异常