我想禁止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");
     }
}

10-07 19:18
查看更多