保护 Web api 不被浏览器外部调用

Posted

技术标签:

【中文标题】保护 Web api 不被浏览器外部调用【英文标题】:Securing Web apis from being called outside the browser 【发布时间】:2017-01-27 17:59:58 【问题描述】:

也许我想多了。

我在浏览器中运行了一些简单的 javascript 游戏(拼图等),当用户获胜时,积分会根据他们完成游戏的速度发送到 laravel 后端。

当用户登录时,会创建一个典型的会话,当通过 POST 请求发送积分时,csrf 和 JWT 也是如此。

用户是否可以在不实际玩游戏的情况下打开 chrome 开发控制台并获取 url,然后复制 crsf、cookie 或 JWT 并将积分发送到后端?

在浏览器外部调用的 API 不遵守 Access-Controll-Allow-Origin 政策。

谁能解释是什么阻止了用户这样做或如何阻止此操作并确保用户真正玩游戏来赚取积分?

【问题讨论】:

也许,您可以检查一下 User-Agent 标头是否设置为附加项。但是,这也可以在不需要网络浏览器的情况下添加。 【参考方案1】:

一种方法是逐步安排游戏。也就是说,使用多个<form> 元素。

初始页面将恰好包含一个 <form> 元素,其中恰好包含游戏的一部分。

只有在提交该表单时,服务器才会将下一个 <form> 元素发送到 document

每个<form> 元素都有一个带有唯一标识符的<input type="submit"> 元素;例如时间戳,设置为name属性并在服务器生成;在游戏过程中的该步骤完成<form> 所需的最长时间内到期。

如果用户提交的<form> 没有唯一标识符,或者<form> 的步骤超出了完成代表流程中一个步骤的<form> 所需的最长时间范围,则用户将被取消“赢得”该当前游戏,或在给定时间内玩游戏。

【讨论】:

很有趣,但是对于有一点编程经验的人来说,这不是很容易操作吗? @Orane “但是对于有一点编程经验的人来说,这不是很容易操作吗?” 服务器端如何确定客户端所做的任何事情在浏览器或提交到服务器?也许考虑在问题上设置赏金;收集问题中描述的潜在问题的一系列可能解释和方法?

以上是关于保护 Web api 不被浏览器外部调用的主要内容,如果未能解决你的问题,请参考以下文章

JS中的闭包问题总结

当我尝试通过 keycloak 调用我的安全 API 时收到状态 401 Unauthorized

javascript 使用闭包保护对象内的属性不被外部修改

在烧瓶中保护 REST api

如何保护公共 API(无凭据)不被利用?

Objective-c:为啥在使用 KVC 时私有 ivars 不被外部访问隐藏