【问题标题】:How to prevent against path traversal attacks when using Class.getResource()使用 Class.getResource() 时如何防止路径遍历攻击
【发布时间】:2013-02-21 09:18:29
【问题描述】:

我希望为我网站的用户提供对 JAR 文件中提供的一些静态资源的访问权限。

我无法提供用户应该能够访问的所有文件的列表,但我可以确保它们都包含在 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

【问题讨论】:

  • 我也在寻找解决方案。有趣的是,我不能在路径中使用“../”来产生这样的攻击。也许它在过程中的某个地方被 Java 过滤掉了。您是否设法自己进行了攻击?

标签: java security jar static-resource


【解决方案1】:

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

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

【讨论】:

  • 看来我需要在自定义安全管理器中实现checkRead()。这需要验证FileDescriptor 的实例,以确保请求的绝对路径在我允许的路径内。这有两个问题 - 首先我必须自己编写路径解析和验证功能,我希望它有很多边缘情况,其次每个 JVM 允许一个 SecurityManager,这意味着我必须限制通过我的整个应用程序访问,而不是仅在我担心的 getResource() 调用中访问,这似乎不太理想。
  • 同上,你不需要继承SecurityManager。应该可以写一个策略文件。
  • @Alison 您正在查看SecurityManager.checkRead 的错误重载。 / 当您在无法控制其实现的类型上调用方法时,您可能需要在调用该方法之前进行任何验证。
【解决方案2】:

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

Providing Your Own Security Manager

希望对你有帮助

【讨论】:

  • 感谢您的指点。同样的评论适用于上面的@Jakub
  • 你不需要继承SecurityManager。应该可以写一个策略文件。
猜你喜欢
  • 2015-01-20
  • 2019-10-15
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2015-04-14
  • 2017-03-31
相关资源
最近更新 更多