为什么添加到购物车需要CSRF保护?


Answers:


14

我相信,对于在Magento的添加到购物车GET操作中为何“需要” CSRF令牌的问题,很难找到一个明确的答案。我将尝试解释其目的。我绝不是安全专家,这是我在特定情况下对CSRF的解释。

语境

来自owasp.org

跨站点请求伪造(CSRF)是一种攻击,它迫使最终用户在当前已通过身份验证的Web应用程序上执行不需要的操作。CSRF攻击专门针对状态更改请求而不是数据盗窃,因为攻击者无法看到对伪造请求的响应。

此攻击的一个示例是将隐藏的图像嵌入到电子邮件或备用网页中:

<img src="http://shop.com/cart/add?sku=sprocket&qty=5" width="0" height="0" border="0">

Web服务器不会区分请求来自何处,并将忠实地将项目添加到该用户的购物车中。

防止CSRF攻击的目的是防止状态更改请求。将商品添加到购物车将被视为状态更改。通常,与提交订单,转移资金或更新电子邮件地址相比,我认为这是无害的状态更改。

关于状态更改和HTTP方法,RFC 2616表示以下内容:

特别是,已经建立了约定,即GET和HEAD方法不应具有除检索之外的其他任何操作。这些方法应该被认为是“安全的”。

Magento和CSRF

Magento确实通过使用令牌(表单密钥)为管理区域和前端区域实现了CSRF预防机制。我想假设Magento的目标(作为旨在由其他开发人员建立的平台)是保护所有状态更改请求。原因是他们不知道实施开发人员或第三方扩展可能会无意间暴露出什么。确保所有状态更改请求的安全性都比使第三方模块公开某些东西和对平台不良PR更为安全。我实际上不知道所有状态更改请求是否都受到CSRF攻击的保护。

需要注意的一件事是,Magento并不总是使用表单键来保护状态更改请求。例如,从购物车中删除(/checkout/cart/delete/id/{ID})和删除客户地址(/customer/address/delete/id/{ID})请求都是传入实体ID的GET请求。然后,控制器(或多个模型)进行处理,以确保授权用户删除这些实体记录(修改状态)。这是Magento不遵循RFC 2616的两个实例。公平地说,对于某些用例,这样做可能不切实际或不必要。

似乎该方法中的表单键检查Mage_Checkout_CartController::addAction是在1.8版中添加的。从发行说明中,我们可以得出以下结论:

解决了可能导致网络商店中发生跨站请求伪造(CSRF)的问题。

不幸的是,该语言含糊不清,“可能”使我相信这是由于我之前所说的假设:安全的状态更改请求。可能会发送导致某些意外行为的其他参数:/checkout/cart/add/product/337/email/new@address.com/password/l33tp4ssw0rd

想法是,通过向购物车中添加某些内容,可以在添加到购物车期间触发一些代码(核心或第三方),例如,通过调度某些事件。

这种漏洞似乎不太可能立即可用,如果确实存在,则希望Magento能够更好地披露细节/风险。我看到的一种风险是Magento在添加到购物车期间product_options在销售订单项目表的列中盲目存储了请求参数(请参阅参考资料info_buyRequest)。从理论上讲,有人可以诱使一组用户使用奇怪的查询参数将商品添加到他们的购物车中,sales_flat_quote_item_option并且sales_flat_order_item如果他们能够使这些用户转换的话,这些商品将被存储到表中,并最终存储在表中。在大多数情况下,这对我来说似乎不太可能。

添加到购物车表格关键问题

人们使用FPC实现和CSRF令牌遇到的主要问题之一是它们最终被缓存了。预热缓存的第一个客户端生成令牌,当第二个客户端获取缓存HIT时,他们现在已经获得了包含第一个用户令牌的页面。提交表单时,令牌将不匹配。

Magento Enterprise使用占位符在缓存页面中查找/替换表单键。Varnish的实现将使likley在使用表单密钥的任何地方都使用ESI。

我很想知道一些比较流行的“ ajax cart”扩展是否最终在将CSRF令牌添加到购物车请求期间检查了CSRF令牌。

我最终在CSRF令牌之前添加到购物车操作的一个功能请求是允许创建添加到购物车链接以用于电子邮件或其他网站(社交媒体)的功能。有时,营销部门希望用户直接将商品添加到购物车,然后立即重定向到购物车或结帐。如果需要CSRF令牌,则很难做到这一点。如果您对风险水平感到满意并且信任自己的代码和任何第三方代码,我只会建议您这样做。


4

Web开发原则说,任何形式的跨站点请求伪造(CSRF)或跨站点脚本(XSS)都是不可取的,应始终避免。

这意味着什么?对于CSRF,您不能拥有任何会改变状态数据本身的URL。否则,攻击者可以通过诱使他们单击或访问该URL(甚至是重定向)来操纵某人购物车的内容,或从其愿望清单或比较中添加/删除项目。

表单键是如何解决这些问题的方法。Magento生成特定于会话的哈希,并要求将其与每个数据更改请求一起提交。

添加/删除购物车商品是否是严重的攻击手段?对于大多数网站,可能不是。但是它仍然是CSRF,并且CSRF不好。这就是为什么现在有form_key值的原因(从CE 1.8开始)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.