如何确保请求从固定页面命中 REST api?

Posted

技术标签:

【中文标题】如何确保请求从固定页面命中 REST api?【英文标题】:How to make sure request hits REST api from a fixed page? 【发布时间】:2018-11-12 18:18:12 【问题描述】:

我有一个基本的 html,其中包含一个表单。此表单提交由 RESTful 后端 api 服务(用 spring boot 编写)处理。由于商业原因,html 页面不受保护 - 任何类型的身份验证/登录机制都不能应用于 HTML。如何确保只允许 html 访问后端 API,而不允许访问其他来源? html 和后端 api 都在同一个域下。示例 - example.com/index.html; example.com/getStudentList

【问题讨论】:

【参考方案1】:

如何确保只允许 html 访问后端 API,而不允许访问其他来源?

如果我的理解正确,您不希望您的 API 的使用者使用 API 进行身份验证,原因是什么?但是你想要的是任何加载索引页面的客户端都可以访问 API。

我能想到的最接近的实现方式就是将 API url 视为一次性垫:您动态生成 html 页面,其中 url 包含一些难以猜测的令牌。当 API 收到任何请求时,它会检查令牌——如果没有令牌,它会拒绝请求(403 - 禁止)。如果有令牌,则检查该令牌是否仍处于活动状态;如果令牌过期,则请求被拒绝。如果令牌处于非活动状态,但在某个宽限期内,您可能会将 API 请求重定向到具有较新令牌的 URL(301 - 永久移动)。如果令牌处于活动状态,那么您就可以处理请求。

Mark Seemann 在尝试解决一个不同的问题时,写了一个不错的小介绍:Avoiding Hackable URLs。

如果您觉得这听起来像是会话 cookie —— 那么,您并没有大错特错。老实说,我怀疑这些差异是微妙的,如果发现我夸大了它们,我也不会感到惊讶。主要区别在于我们将缓存失效和资源生命周期等内容明确地传达给中间组件。另一方面,Cookie 标头实际上是不透明的。

这个答案肯定是不完美的——任何碰巧猜测当前活动 URL 的人都将能够访问 API,无论他们是否点击了索引页面。默默无闻,而不是安全。

但在你有合理的要求之前,这可能足以让你渡过难关。

【讨论】:

基本上,html 的唯一目的是加载到客户端的 iframe 中。这些 api 仅用于该 html 的内部使用。如果客户端绕过 html,直接点击 api,那么一开始就没有必要制作那个 html。我希望客户端在该 html 中执行所有操作(在他们的页面中作为 iframe 加载)。我从 HTTP 有效负载中观察到,每次客户端通过 iframe 的 html 发出有效请求时,http 标头都包含一个引用字段,例如 example.com/index.html 我打算利用这个。因为这将确保客户端通过 html(在 iframe 内)发出请求。但是后来知道referer字段很容易被欺骗。 感谢您的详细回复。我还处于掌握它的阶段。让我们看看我是否可以利用您编写的内容管理解决方案。

以上是关于如何确保请求从固定页面命中 REST api?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保只有我的 javascript 客户端 Web 应用程序向 REST API 发出请求?

如何让Googlebot抓取从AJAX加载的内容,但阻止它对网址命中的索引?

如何从 JavaScript 调用 REST Web 服务 API?

在WePay上将API从REST迁移到gRPC

防止rest api中的重复请求

如何从 HTML 表单调用现有的 REST api?