我正在尝试将文件名的字符列入白名单并防止路径操纵。我们获取从前端返回的文件名(我知道)并解析它以确定它是否在指定的文件夹中。因此,我们需要确保用户没有传递可能从指定文件夹中逃脱的文件。这意味着我们的有效文件名是:
- 字母数字
- 可以包含任一方向的单斜杠
- 可以包含单个点,但不能包含点对。
所以“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”
如有任何帮助,我们将不胜感激。
最佳答案
你想要这样的东西吗? (我不清楚你想要什么!)
String filename = "APP-TEST-file.20161115.1";
// replace two consecutive dots with a single dot
filename = filename.replaceAll("\\.+", ".");
// replace two consecutive forward slash with a single forward slash
filename = filename.replaceAll("/+", "/");
// replace two consecutive baskslash with a backslash
filename = filename.replaceAll("\\\\+", "\\\\");
// allow alphanumeric characters, dots and both type of slashes
filename = filename.replaceAll("[^A-Za-z0-9./\\\\]+", "");
System.out.println(filename);
它打印:
APPTESTfile.20161115.1
如果 filename="/../../test//\\"
,则打印 - /././test/\
。
关于java - 删除所有非字母数字、单句点和单斜杠的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002747/