我想禁止spring webapp(在tomcat中运行)使用任何在其中包含“ ..”的文件路径。
显然,首先要做的是在将用户信息用于文件路径之前对其进行清理。但是,应用程序中有数百个地方可以进行文件访问,因此需要花费大量的精力来手动验证所有地方均已正确实现。
我只想做类似添加或修改Java SecurityManager的操作,以防止文件名中包含“ ..”。
我的第一次尝试是创建自己的SecurityManager并覆盖诸如checkRead和checkWrite之类的方法,但事实证明这还不够。该方法的默认实现似乎不允许任何操作,因此我怀疑从头开始创建方法实际上并不是应该完成的方法。
我想的另一种可能性是使用Aspectj,但是如果可以使SecurityManager工作,那似乎是一个更好的主意。
那么,要禁止所有文件名中的“ ..”,最简单的事情是什么?我是否可以安装和使用任何SecurityManager实施,以使Web应用程序更安全?
最佳答案
使用..
表示使用某些父目录。您可以使用SecurityManager来检查文件是否仅在其允许的目录内时才被允许:
@Override
public void checkPermission(Permission perm) {
if( perm instanceof FilePermission ) {
Path path = Paths.get(perm.getName()).normalize().toAbsolutePath();
//TODO: check that path is in one of allowed directories
if( !path.toString().startsWith( myAllowedRootDir ) )
throw new SecurityException("Not allowed");
}
}