【发布时间】:2014-06-25 00:07:16
【问题描述】:
我想拦截 File、FileReader、FileWriter、FileInputStream 和 FileOutputStream 的构造函数,并防止任何文件名包含“..”(防止路径遍历攻击)或“\0”(防止文件名空字符攻击)。
我还有一个关于如何使用 SecurityManager 做同样事情的未决问题,但还没有人回答,所以我希望这种替代方法能奏效。
这是用于 tomcat 上的 spring webapp。
我知道我可以通过创建自己的 SafeFile、SafeFileReader 等类并修改代码以使用它们来手动执行此操作。但是,我们的代码中有 960 个地方使用了这些对象的构造函数,所以我宁愿避免这种情况,除非这是唯一的方法。
【问题讨论】:
-
你有接受文件路径作为参数的 960 个服务吗?虽然您可能有 960 个与文件交互的位置,但路径的来源真的到处都是不可信的吗?
-
与其使用繁重的方法作为 AOP 相比,使用工厂来创建文件不是更容易。修改960个地方使用那个工厂,你就解决了。修改所有这些地方应该不难重构。当然,您可以使用 AspectJ 做任何您想做的事情,并使用加载时编织(不是使用普通 Spring AOP)修改您提到的类,但感觉就像使用大炮杀死苍蝇。