用户可以提交子文件夹/文件名进行下载。
子文件夹/文件名将然后用于从预先确定的文件夹中提供文件。
最后,我正在做new File(folder, "subfolder/filename")
。
但在此之前,我还会检查!"subfolder/filename".contains("..")
但这足够了吗?是否有可能出现两个点(..)可能不会相继出现的情况,但在传递给新文件时仍被解释为两个点(... )?
用户是否可以通过其他方式导航回来并覆盖此文件夹外的内容?
您是否需要采取其他措施来保护文件夹中的子文件夹/文件名访问权限?
答案 0 :(得分:1)
您可以执行类似
的操作cd ./\.\.
在Unix中,它会将目录更改为父目录。可能是你可以解析文件,当检查它是否在正确的父母下?
UPD:在java中看起来你不能使用\。\。模式http://goo.gl/4Rszg5但它并不意味着检查" .."足够了。更好地检查规范路径
答案 1 :(得分:1)
从操作系统中可以得到绝对路径,所以有点慢。
String folderPath = folder.getCanonicalPath() + File.separator;
File file = new File(folder, "subfolder/filename");
String path = file.getCanonicalPath();
if (!path.startsWith(folderPath)) {
log(Level.ERROR, "Security breach attempt: ...");
return;
}
也可以进行简单的检查:
Pattern BREACH = Pattern.compile("\\.[\\\\]*\\.");
if (BREACH.matcher(path).find()) { ... }
当您使用版本控制或其他" protected"文件/文件夹,然后以点开头的文件或文件夹的名称也是非法的。