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/")