【问题标题】:Create a secret url using spring boot使用 spring boot 创建一个秘密 url
【发布时间】:2017-05-11 00:42:50
【问题描述】:

我正在研究为多平台应用程序创建 API 的不同技术。此应用程序必须允许用户无需身份验证即可与朋友共享文件,但 URL 必须不可猜测,以便文件保密。就像在谷歌照片中分享图片功能一样。

Spring boot 是创建多平台 API 的最有趣的框架之一,但我想知道是否可以创建一个秘密且不可猜测的 URL。

感谢您的宝贵时间。

【问题讨论】:

  • 如果你在获取资源的路径中放一个随机的 UUID(128 位十六进制字符串),你几乎可以假设人们无法猜到它们。

标签: spring


【解决方案1】:

回答您的问题:您可以使用一些随机的难以猜测的部分(例如 https://hostname/fileshare/Zak/myVideos/295223cb464d4e4794b93a09a1c730fd)来组织您的 URL 路径,UUID 是 128 位数据并且非常标准。

另一种方法是在 queryString 中添加校验和标记: https://hostname/fileshare/Zak/myVideos/lolcat.mp4?h=187515ZEDwhere 令牌是使用某种安全算法(例如 hmac256)从 url 路径(甚至可能是 queryString)生成的,并让您的 Controller(或更好的 Filter)检查 h 参数是否确实等于散列路径。

编辑:进一步解释:

我假设您已经拥有(或至少打算拥有)一个能够根据文件系统目录提供内容的控制器。在我之前的例子中,我假设了一些类似/Zak/myVideos/ 的东西。 Spring 控制器可以通过文件名轻松地返回此目录中的文件,但如果文件名很容易猜到(例如video.mp4),我知道 /Zak/myVideos/video1.mp4 会很容易受到攻击。这就是我建议使用 UUID 的原因。

如何使用 UUIDS?

如果您可以重命名 /Zak/myVideos 中的文件,只需通过随机 UUID 重命名它们,它将透明地工作。这样做的缺点是 1) 文件名不再具有任何意义,并且 2) 您可能无法重命名这些文件。

您还可以拥有一个引用文件名和 UUID 的数据库表,并且只需让您的控制器调用服务以从正确的 UUID 检索正确的文件名。这样做的缺点是您需要有一个数据库并编写一些代码(并减慢 API 调用来查询数据库)。

这就是为什么我还建议简单地使用令牌。该 url 仍将是您文件的文字路径,但需要在 queryString 中添加一个附加参数(令牌)。 servletRequestFilter 可以在授予对提供文件的控制器的访问权限之前检查令牌是否有效(使用简单的哈希 + 检查算法)。这样,您无需重命名文件或创建数据库。

【讨论】:

  • 谢谢杰里米,但我想知道是否有一种原生的方式来使用 spring。例如用于身份验证和保护 URL 的 Spring Security。
  • 您可以使用 java.util.UUID.randomUUID() 在 java 中本地生成随机 UUID,这就是我建议它的原因。由于您没有解释文件将如何最终出现在您的服务器上,因此我认为我无法进一步帮助您生成 URL。
  • 我认为使用令牌更好地让用户有可能在延迟后撤销它。谢谢你的时间杰里米
  • 是的,你实际上可以把你想要的逻辑放在令牌后面。
猜你喜欢
  • 1970-01-01
  • 2018-07-04
  • 2020-12-04
  • 2018-12-26
  • 2019-05-23
  • 2019-11-29
  • 1970-01-01
  • 2021-10-26
  • 2019-11-14
相关资源
最近更新 更多