Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中验证文件路径?_Java - Fatal编程技术网

如何在java中验证文件路径?

如何在java中验证文件路径?,java,Java,我正在编写一个Java程序,从用户那里读取一些输入,这些输入应该是预定义文件夹的相对路径。例如,他将进入test/subfolder,我将生成/path/to/test/subfolder 我如何检查并防止用户输入类似于。/../../的内容,这样会弄乱路径并允许他访问不允许访问的路径?对于Java 7+,使用path对象,您可以在创建最终路径之前调用该方法。该方法将通过取消。和前面的路径段并去掉任何段来规范化路径 有一些情况需要考虑。例如,如果提供的路径是相对的 ../first/second

我正在编写一个Java程序,从用户那里读取一些输入,这些输入应该是预定义文件夹的相对路径。例如,他将进入test/subfolder,我将生成
/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指的是相对路径。顺便说一句,我真的想知道除了这两个点之外是否还有什么危险的地方(
)。欢迎提出任何建议。