因此,我需要创建一个正则表达式,该正则表达式将在我的服务器上使用,以确保用户请求访问的所有文件都在特定目录下。让我们命名该目录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("/UserFiles/")


或者,取决于如何解释您的问题:

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

10-08 08:14