我想拦截File,FileReader,FileWriter,FileInputStream和FileOutputStream的构造函数,并防止任何文件名包含“ ..”(以防止路径遍历攻击)或“ \ 0”(以防止文件名为空字符攻击)。
我还有一个关于如何使用SecurityManager进行相同操作的未解决问题,但是还没有人回答,所以我希望这种替代方法可以工作。
这是用于tomcat上的spring webapp。
我知道我可以通过创建自己的SafeFile,SafeFileReader等类并修改代码以使用这些类来手动执行此操作。但是,在我们的代码中有960个位置使用了那些对象的构造函数,因此,我希望避免这种情况,除非这是唯一的方法。
即使Sotirios Delimanolis链接到此处的答案是正确的(我自己写的),对于AspectJ而不是基于代理的Spring AOP是必需的,但请注意,您不能将其execution(*.new(..))
用于JDK类,因为默认情况下,它们不包括在Aspect Weave中。为了编织到JDK类中(执行连接点在逻辑上位于被调用者代码中),您需要修改JDK的rt.jar或至少将修改后的JDK类放在JDK本身之前的bootclasspath上。这是可能的,但并非无关紧要。
但是,还有一个更简单的选择:编织成来电者(你自己的代码),而不是通过被调用者call(*.new(..))
-记之间的差异call()
和execution()
。反过来,这意味着您无法拦截不是通过您自己的编织代码或JDK本身进行的JDK类的调用。因此,即使对于不在您自己控制范围内的代码,即使您需要100%的解决方案,也将最终编织JDK。但是,如果您只想保护自己的类,则可能没有必要。:-)
尽管我是AspectJ的忠实拥护者,但我想强调一点,我还是干净代码和重构的坚定支持者。任何像IntelliJ IDEA或Eclipse这样的体面的IDE都应该使重构960调用非常简单,以使用您建议的安全包装类。如果它是如此重要,为什么不这样做呢?IDEA的结构化搜索和替换功能可在数分钟(甚至几秒钟)内为您完成。AOP可以但不应用于弥补您自己代码的缺陷。因此,请重构,之后您会更加快乐。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句