我在Web服务器上有一个充满文件的目录层次结构,我希望用户能够通过请求访问这些文件中的任何一个。(这比这复杂一点,这就是为什么我需要访问Java Web应用程序中的文件。)
实现此目的的自然方法是允许用户指定文件,例如使用正斜杠/my-web-endpoint?param=folder1/folder2/file.txt。然后我会在Java中找到类似的文件new File(baseDirectory, param)。到目前为止,一切正常。
但是,如果用户要求提供param=../something-private/file.txt诸如此类的东西怎么办?我应该如何预防呢?
我可以只禁止使用其中的参数..,但这够了吗?我总是有点担心黑名单。如果我没有想到另一种语法怎么办?(例如,想出一个新的道路/。但是也许还有其他人。)
我可以使用getCanonicalFile(),然后检查路径是否以基本目录开头,例如
File baseDirectory = ....
String param = ...
File desiredFile = new File(baseDirectory, param);
if ( ! desiredFile.getCanonincalPath().startsWith(
baseDirectory.getCanonincalPath()+File.separator))
throw ...
这够了吗?会出什么毛病吗?
正确的方法是什么?
心有法竹
相关分类