0

我正在创建一个用户上传和下载数据的平台。上传的数据量并非微不足道——这可能是 GB 量级。

用户应该能够通过超链接下载这些数据的子集。

如果我没记错的话,我的 AWS 账户将被收取下载这些文件的出口费用。如果这是真的,我担心两个相关的情况:

  1. 滥用这个,不断点击下载超链接的用户(超过合理)
  2. 更令人担忧的是,每隔几秒钟就会点击下载链接的机器人。

我曾计划让任何访问该网站的人都可以访问下载作为公共资源。当然,如果用户登录平台,我可以轻松限制一段时间内下载的数据量。

对于公共网站,如何阻止用户下载过多?我可以使用 IP 地址吗?

任何见解表示赞赏。

4

2 回答 2

1

您基本上需要决定您的文件是否可供世界上的每个人访问(如普通网站),或者它们是否应该仅供登录用户访问。

例如,假设您正在运行一个照片共享网站。用户希望他们的照片是私密的,但他们希望能够访问自己的照片并与其他特定用户共享选定的照片。在这种情况下,所有内容都应默认保持为私有。那么流程将是:

  • 用户登录应用程序
  • 当用户想要一个指向他们的文件的链接,或者如果应用程序想要<img>在 HTML 页面中使用标签(例如显示照片缩略图),应用程序可以生成一个Amazon S3 预签名 URL,这是一个时间-授予对私有对象的临时访问权限的有限 URL
  • 用户可以点击该链接,或者浏览器可以使用 HTML 页面中的链接
  • 当 Amazon S3 收到预签名 URL 时,它会验证它是否已正确创建并且未超过到期时间。如果是这样,它提供对文件的访问。
  • 当用户与另一个用户共享照片时,您的应用程序可以在数据库中跟踪它。如果用户请求查看他们已被授予访问权限的照片,则应用程序可以生成预签名 URL。

这基本上意味着您的应用程序可以控制哪些用户可以访问存储在 Amazon S3 中的哪些对象。

或者,如果您选择公开访问 Amazon S3 中的所有内容,则无法限制文件的下载。

于 2020-12-07T01:28:06.490 回答
1

IP地址可以轻松更改。因此,它的控制很差,但可能总比没有好。

对于机器人,请使用capcha。这是防止自动抓取链接的有效方法。

此外,您可以考虑通过API gateway提供对链接的访问。网关具有您可以设置的限制(例如每分钟 10 次调用)。这样你可以确保你不会超过一些预定义的。

除此之外,您还可以使用S3 预签名 URL。它们有到期时间,因此您可以调整此时间以在短时间内有效。这也可以防止用户共享链接,因为它们会在设定的时间后过期。在这种情况下,他的用户将通过 lambda 函数获取 S3 预签名的 url,该函数将从 API 网关调用。

于 2020-12-07T00:35:24.450 回答