2013-02-21 63 views
4

我期待为我的网站的用户提供对JAR文件中提供的一些静态资源的访问。如何在使用Class.getResource()时防止路径遍历攻击()

我无法提供用户应该能够访问所有文件的列表,但我可以保证,他们都包含在JAR的子目录中,如:

public-access/file-1 
public-access/file-2 
public-access/sub-dir/file-3 

的文件将通过以下方式访问:

this.getClass().getResource("/public-access/" + requestedFile); 

是否有推荐的方法来防止路径穿越攻击?这是为了防止恶意用户请求一个叫做例如../secret,或sub-dir/../../secret

+0

我正在寻找一个解决这一点。有趣的是,我不能在路径中使用“../”来制造这样的攻击。也许它正在被Java中的某个地方过滤掉。你是否设法自己执行攻击? – Zero3 2015-03-19 23:49:15

回答

1

看一看安全管理:http://docs.oracle.com/javase/tutorial/essential/environment/security.html

我认为它支持正是你需要的,只是指定给开放路径的资源是不允许的。

+0

看起来我需要在自定义安全管理器中实现'checkRead()'。这需要验证一个'FileDescriptor'实例,以确保所请求的绝对路径在我允许的路径内。有两个问题 - 首先,我必须自己编写路径解析和验证功能,我期望有很多边缘案例,其次,每个JVM都有一个'SecurityManager',这意味着我必须限制通过我的整个应用程序访问,而不是仅仅在我担心的'getResource()'调用中访问,这似乎并不理想。 – Armand 2013-02-21 12:48:26

+0

如上所述,您不需要继承'SecurityManager'。应该可以写一个策略文件。 – 2013-02-21 19:10:51

+0

@Alison您正在查看'SecurityManager.checkRead'的错误超载。 /当你在一个类型上调用一个方法时,你无法控制实现,你可能想在调用方法之前进行任何验证。 – 2013-02-21 19:13:25

1

您需要的是通过覆盖SecurityManager来定义自定义安全策略。 查看本教程,很好地解释了如何创建一个和注册。

Providing Your Own Security Manager

希望这有助于

+0

感谢您的指针。上面的@Jakub适用相同的注释 – Armand 2013-02-21 12:49:02

+0

您不需要继承'SecurityManager'。应该可以写一个策略文件。 – 2013-02-21 19:09:19