php - 对匿名用户使用 CSRF 保护是否有意义?

标签 php laravel csrf

CSRF 保护是否应该用于匿名用户,或者这是否违背了它的目的?

我有一个可以匿名访问的 URL。当使用适当的信息访问 URL 时,一些值会在我的数据库中更新。例如,客户可以在他们的订单确认页面上放置一些代码,这些代码将向 http://example.com/save-request 发出 POST 请求,并发送以下数据:

{orderId: 1234, referralCode: 'ABCDEF'}

当我收到此请求时,我会使用推荐代码更新数据库中的给定订单:

$order = Order::find(Input::get('orderId'));
$order->referral_code = Input::get('referralCode');
$order->save();

我正在努力保护此 URL 免遭滥用,以便用户无法发送随机订单 ID 请求并尝试获取与其相关联的推荐代码。

我想到了 CRSF 保护,但这意味着我需要先获取 token ,这需要另一个公共(public) URL。这似乎会使滥用变得稍微困难​​一些,但仍然有可能,因为滥用者可以简单地获取 token ,然后像往常一样发出请求。

是否有任何策略可以防止此类滥用?

最佳答案

CSRF 旨在保护经过身份验证的 session 。基本思想是:服务器为所有经过身份验证的 session 向客户端提供一个 CSRF token 。客户端应该在每个后续请求中将相同的 CSRF token 传递给服务器。因此,如果请求没有 token ,服务器应该忽略/记录它。理想情况下,您的 CSRF token 应该只传递给客户端身份验证。如果有一个单独的 URL 来获取 CRSF token ,它就变得毫无意义。

在您的情况下,由于用户在“订单确认”时始终是匿名的,因此 CSRF 保护不太适用。我认为最好的策略是对数据和 API 进行建模,以便每个“订单确认”都是一个带有可选“referralCode”的原子请求。您的 API 函数/端点,可能是 /confirm-order,然后可以获取 referralCode 并将其与任何其他确认一起保存到 Order 对象中处理逻辑。编辑顺序的 API 函数/端点,可能是 /edit-order,应该需要身份验证。然后,应用标准的 CSRF 保护。

但是,如果您打算允许匿名用户更改他们的订单详细信息,包括referralCode,您可以通过跟踪更改来减少滥用,并且只允许最大数量的变化。如果有帮助,您还可以添加一些时间限制。

关于php - 对匿名用户使用 CSRF 保护是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143437/

相关文章:

php - 测试 Laravel 5.2 时不要移动原始文件

PHP 没有获取 SQL 日期字段 1970

java - Java Websockets 中的来源检查以防止 CSRF

angularjs - 带有 AngularJS 的 Spring Boot 和 CSRF - Forbitten 403 -> 错误注销

php - 对 Oracle 用户过程/函数进行基准测试

javascript - 在for循环javascript中显示唯一值

php - Laravel Doctrine 仅从 findAll() 查询返回单个属性

php - Eloquent 将 POINT 数据返回为 UTF8

php - Laravel从数据库返回的日期时间与同一数据库中的记录不同

cookies - 在 cookie 中存储不记名 token 的安全性