Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
regex不允许访问父目录-java_Java_Regex_Directory - Fatal编程技术网

regex不允许访问父目录-java

regex不允许访问父目录-java,java,regex,directory,Java,Regex,Directory,因此,我需要创建一个正则表达式,它将在我的服务器上使用,以确保用户请求访问的所有文件都位于特定目录下。让我们将该目录命名为UserFiles,并假设它位于路径/Server/Users/Bob/UserFiles下 因此,现在当客户端发送读取文件的请求时,我想验证他请求访问的路径是否在/Bob/UserFiles/下 我考虑过确保路径的前缀总是以/Userfiles/开头,并且路径中没有。(这样也可以保护我不受限制访问,比如/Userfiles/../../noAccess.txt) 不允许输入

因此,我需要创建一个正则表达式,它将在我的服务器上使用,以确保用户请求访问的所有文件都位于特定目录下。让我们将该目录命名为
UserFiles
,并假设它位于路径
/Server/Users/Bob/UserFiles

因此,现在当客户端发送读取文件的请求时,我想验证他请求访问的路径是否在
/Bob/UserFiles/

我考虑过确保路径的前缀总是以
/Userfiles/
开头,并且路径中没有
(这样也可以保护我不受限制访问,比如
/Userfiles/../../noAccess.txt

不允许输入的示例:

C:/UserFiles/

。/../Alice/txt.txt

/UserFiles/./../noAccess.txt

允许输入的示例:

/UserFiles/UserFiles/Alice/txt.txt

/UserFiles/txt.txt

/UserFiles/Bob/Bob/txt.txt

我想不出任何情况下这会不起作用。我还尝试构建正则表达式,但它并不完全正确,因为它允许输入,如
/UserFiles//txt.txt
(可能允许更多我不知道的内容)

那么,我的想法是否完整,或者还有其他我没有想到的案例?如果我的想法是完整的,你能帮我修复我的正则表达式吗


(?!\。\)^\/UserFiles\/[/\w\s-]+\.[A-Za-z]{3}$

解析路径并仅在事后检查如何(注意,行为取决于操作系统):

或者,根据如何解释您的问题:

new File(input).getCanonicalPath().startsWith("/Server/Users/Bob/UserFiles/")

我真的没有想到那个解决办法。我不确定CanonicalPath是如何工作的,但我可以试一试并留下一些反馈。Thankstrings版本的
startsWith(“/UserFiles”)
还允许访问名为
UsersFilesFoo
的目录。使用
startsWith(“/UserFiles/”)
更安全一些。另外,我不确定
getCanonicalPath
在服务器上的行为。与使用
childPath.startsWith(parentPath)
相比,最好创建
/Server/Users/Bob/UserFiles的规范路径和用户提供的路径的规范路径,如@Pshemo:Good input所述。固定的。实际上,我在这里的回答中对所有可能忽略的信息安全问题都很谨慎……因此,就我的示例而言,您实际上指的是
新文件(input).getCanonicalPath().startsWith(“/Server/Users/Bob/UserFiles/”)
对吗?@Rakim这取决于您在问题中的意思:)如果您消除歧义,我将修复我的答案
new File(input).getCanonicalPath().startsWith("/Server/Users/Bob/UserFiles/")