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