如何使用AOP拦截File,FileReader,FileWriter,FileInputStream和FileOutputStream的构造函数?

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

我还有一个关于如何使用SecurityManager做同样事情的公开问题,但还没有人回答它,所以我希望这种替代方法能够起作用。

这是tomcat上的spring webapp。

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

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

但是有一个更简单的选项:编织到调用者(你自己的代码),而不是call(*.new(..)) callees call(*.new(..)) .new call(*.new(..)) – 注意call()execution()之间的区别。 这反过来意味着您不能拦截对不是由您自己的编织代码或JDK本身制作的JDK类的调用。 因此,如果您需要100%的解决方案,即使是不受您自己控制的代码,您最终也会编织JDK。 如果您只想保护自己的课程,可能这不是必要的。 🙂

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

Simple Spring AOP(带代理)不支持构造函数连接点。

Spring AOP目前仅支持方法执行连接点(建议在Spring bean上执行方法)。

如果你可以使用aspectj , 那应该可以解决问题 。 否则,你必须自己玩字节码。