我正在尝试为文件名列出白名单并防止路径操纵。我们接受从前端返回的文件名(我知道),并对其进行解析,以确定它是否在指定的文件夹中。因此,我们需要确保用户未传入可能会跳出指定文件夹的文件。这意味着我们认为有效文件名的情况如下:
- 字母数字
- 可以包含任一方向的单个斜杠
- 可以包含单个点但不能是一对。
所以,“APP-TEST-file.20161115.1”是有效的,但“/../../ test // \”需要在检查文件系统之前删除一些字符。
这是我现在的正则表达式,不幸的是它移除了太多内容。
public static String validateFilePath(String fileName) {
return fileName.replaceAll("[^A-Za-z0-9]+[(\\.\\/)\\+2]", "");
}
将 "APP-TEST-file.20161115.1" 转换为 "APP-TEST-file0161115.1"
非常感谢您的帮助。
+2
移除后,"/../../test//\"
变为"test"
,但是"APP-TEST-file.20161115.1"
保持不变。这是期望的输出吗? - secondbreakfastAPP-TEST-file.20161115.1
是无效的,因为它包含连字符(-
)。 - Andreas