我想拦截File,FileReader,FileWriter,FileInputStream和FileOutputStream的构造函数,并阻止任何文件名包含" .." (防止路径遍历攻击)或" \ 0" (防止文件名为空字符攻击)。
我还有一个关于如何使用SecurityManager做同样事情的未解决的问题,但是还没有人回答它,所以我希望这种替代方法可行。
这是关于tomcat的spring webapp。
我知道我可以手动执行此操作,方法是创建自己的SafeFile,SafeFileReader等类,然后修改代码以使用它们。但是,我们的代码中有960个地方使用这些对象的构造函数,所以除非它是唯一的方法,否则我更愿意避免这种情况。
答案 0 :(得分:3)
即使Sotirios Delimanolis在这里链接的答案是正确的(我自己写的),只要AspectJ而不是基于代理的Spring AOP是必要的,请注意你不能将execution(*.new(..))
用于JDK类,因为那些默认情况下从方面编织中排除。为了编织JDK类(执行连接点在逻辑上是在被调用者代码中),您需要修改JDK的rt.jar或者至少将修改后的JDK类放在JDK本身之前的bootclasspath中。这是可能的,但不是那么微不足道。
但是有一个更简单的选项:编织到调用者(您自己的代码),而不是通过call(*.new(..))
编入调用者 - 注意call()
和execution()
之间的区别。这反过来意味着您不能拦截对不是由您自己的编织代码或JDK本身制作的JDK类的调用。因此,如果您需要100%的解决方案,即使是不受您自己控制的代码,您最终也会编织JDK。如果您只是想保护自己的课程,可能这不是必要的。 : - )
尽管我是AspectJ的忠实粉丝,但我想强调一点,我也是清洁代码和重构的坚定支持者。任何体面的IDE,如IntelliJ IDEA或Eclipse都应该让重构960调用变得非常简单,以便像你建议的那样使用安全的包装类。如果它如此重要,你为什么不这样做呢? IDEA的结构搜索和替换会在几分钟内为您完成,即使不是几秒钟。 AOP可以,但不应该用于修补您自己的代码的缺陷。所以请进行重构,之后你会更开心。
答案 1 :(得分:1)
Simple Spring AOP (with proxying) does not support constructor join points.
Spring AOP目前仅支持方法执行连接点 (建议在Spring bean上执行方法)。
如果您可以使用aspectj
,that should do the trick。否则,你必须自己玩字节码。