如何在java中验证文件路径?
我正在编写一个Java程序,从用户那里读取一些输入,这些输入应该是预定义文件夹的相对路径。例如,他将进入test/subfolder,我将生成如何在java中验证文件路径?,java,Java,我正在编写一个Java程序,从用户那里读取一些输入,这些输入应该是预定义文件夹的相对路径。例如,他将进入test/subfolder,我将生成/path/to/test/subfolder 我如何检查并防止用户输入类似于。/../../的内容,这样会弄乱路径并允许他访问不允许访问的路径?对于Java 7+,使用path对象,您可以在创建最终路径之前调用该方法。该方法将通过取消。和前面的路径段并去掉任何段来规范化路径 有一些情况需要考虑。例如,如果提供的路径是相对的 ../first/second
/path/to/test/subfolder
我如何检查并防止用户输入类似于
。/../../
的内容,这样会弄乱路径并允许他访问不允许访问的路径?对于Java 7+,使用path
对象,您可以在创建最终路径之前调用该方法。该方法将通过取消。
和前面的路径段并去掉任何
段来规范化路径
有一些情况需要考虑。例如,如果提供的路径是相对的
../first/second
Path path = Paths.get("../first");
path = Paths.get("/").resolve(path.normalize()).normalize();
在这种情况下,规范化无法删除。
,因为它不知道前面会是什么。您所要做的就是在root上解析此路径/
。比如说
../first/second
Path path = Paths.get("../first");
path = Paths.get("/").resolve(path.normalize()).normalize();
路径可以有任意数量的。
Path path = Paths.get("../../../../first/../second/../../more");
path = Paths.get("/").resolve(path.normalize()).normalize();
该过程将持续应用
还存在提供的路径是绝对路径的情况。在这种情况下,您可以立即对其进行规范化
Path path = Paths.get("/../../../../first/../second/../../more").normalize();
然后可以根据前缀路径解析提供的路径(如果提供的路径是绝对路径,请小心)
对于其他人提出的符号链接,请在使用时继续使用NIO。为了更一致,我会让他写他想要的内容,并在他选择路径后检查是否允许(获取所选文件并检查其路径)。他可能会找到一种你没有想到的方式,例如别名
此外,如果您希望界面对用户友好,并且在用户选择路径时通知界面已被禁止,请使用正则表达式检查输入的路径中是否有../(或者只需执行
pathString.indexOf(“..”)=-1
check)我以前就尝试过这个问题。如果使用以下命令将预定义文件夹与路径合并:
new Path(basePath, givenRelativePath);
那么除了。
之外,我不知道还有什么会导致baseDir之外的结果(当然,前提是没有指向外部的符号链接)。因此,最简单的检查是检测两个连续点的存在,就像丹尼尔斯建议的那样
如果您想绝对确定(并处理符号链接或其他潜在危险的东西),您可以这样检查结果(只是一个草图):
这基本上就是我在几个月前结束的
当然,在Java 7+中,您可以使用
Path
s和normalize
方法,而不是getCanonicalPath
,后者速度更快,而且不涉及文件系统。另一方面,它不考虑SysLink和其他东西。如果你真的想忽略用户输入,如果以“…”或“…”的形式键入相对路径, 你可以试试这个。。
这是不对的。
normalize
方法不会删除所有。它只删除前面有目录的内容。例如,新文件(“../../../../a/b/./c”).toPath().normalize()
产生。\..\..\..\..\a\c
@Marwin解决方案是根据根路径解析相对路径/
。根路径应该可以工作(在我发表评论时没有提到)。@Marwin yes,编辑以更正我的错误。谢谢。您可以使用它通过解析//之类的元素来生成绝对路径引用。/这根本不起作用。你试过了吗?str1将是。/../../../path/to/folder
@MArwin是的,我有,输出如上所示。顺便说一句,如果你有这样的路径“/../a/../b/c”,那么这个解决方案将不会像Sotirios所描述的那样起作用,所以“a”部分也会被切割。注意,它将与绝对路径一起工作,但是@Marwin指的是相对路径。顺便说一句,我真的想知道除了这两个点之外是否还有什么危险的地方(。
)。欢迎提出任何建议。