【译】了解 CSRF 攻击
了解 CSRF 攻击
跨站点请求伪造 (CSRF
) 是一种攻击,它诱骗用户在当前已通过身份验证的 Web
应用程序上执行不需要的操作。
想象一下,您已经登录了网上银行平台。在另一个选项卡中,您单击一个看似无害的链接。您知道的下一件事是,钱在您不知情的情况下从您的账户中转出。哦不,你刚刚成为 CSRF
攻击的受害者!但这怎么会发生呢?
CSRF 攻击分几个步骤发生:
- 攻击者识别出容易受到
CSRF
攻击的目标站点。通常,这是一个通过可预测的URL
或请求执行重要操作的网站。
- 攻击者创建恶意请求。对于此演示,让我们假设我们银行的网站使用简单的 URL 转账,例如
bank.com/transfer?amount=1000&toAccount=attackerAccountId
.用户 - 不知道将要发生什么 - 刚刚登录了银行的网站,该网站设置了一个会话cookie
。
-
攻击者需要诱骗经过身份验证的用户触发此请求。他们可以通过要求用户单击链接或将恶意 URL 嵌入到其他站点上的图像源代码中来做到这一点,例如:
<img src="bank.com/transfer?amount=100&to=AttackerAccount" />
.
在这种情况下,攻击者创建了一个网站,该网站在页面加载时自动提交表单。用户只需访问网站即可发送此请求。
- 攻击者可以使用用户的 cookie 和会话向银行服务器发出合法请求。资金在幕后转移,通常是在用户不知情的情况下。
为什么 CSRF 如此重要?
CSRF
攻击很危险,因为它们:
- 利用经过身份验证的会话,使操作看起来合法。
- 可以在用户不知情的情况下执行。
- 通常很少留下痕迹,因为不清楚哪些用户操作是合法的,哪些是不合法的。
防止 CSRF 攻击
作为开发人员,我们可以实施一些措施来保护我们的用户免受 CSRF
攻击。
Anti-CSRF Tokens
反 CSRF
令牌,通常简称为 CSRF
令牌,是针对 CSRF
攻击的常见且有效的措施。它们通过要求任何状态更改请求包含服务器将验证的令牌来增加额外的安全层。
- **令牌生成:**当用户登录网站时,服务器会为该用户的会话生成唯一的
CSRF
令牌。此令牌通常是一个难以猜测的随机字符串。 - **发送令牌:**服务器将此令牌发送到客户端的浏览器。浏览器可能会将此令牌存储在隐藏的表单字段、Cookie 或站点的本地存储中。
- **发出请求:**每当浏览器想要发出可以更改数据或状态的请求(如转账或更新电子邮件地址)时,它都必须将此
CSRF
令牌作为请求的一部分。 - **服务器验证:**当服务器收到请求时,它会检查请求中的
CSRF
令牌是否与该用户会话的记录令牌匹配。如果令牌不匹配或缺少令牌,服务器将拒绝请求。 - **寿命短:**这些代币的寿命通常很短,以进一步增强安全性。这意味着,即使攻击者设法掌握了令牌,他们进行攻击的窗口也非常有限;之后令牌变得无用。
每次用户加载表单时生成一个唯一的令牌,并将其嵌入到表单中。在服务器端,在提交表单时验证此令牌。攻击者无法预测此令牌,因此很难构建有效的恶意请求。
SameSite Cookie 属性
现代浏览器支持 SameSite cookie
属性,该属性可防止在跨站点请求中发送 cookie
。此属性对 CSRF
攻击特别有效。在此处阅读有关 SameSite cookie 属性的更多信息。
检查 Referer 标头
服务器可以检查传入请求的 Referer
标头,以验证它们是否来自受信任的页面。
避免 GET 状态更改操作
仅保留用于数据检索 GET
的请求,并避免使用它们来修改应用程序的状态。相反,请使用 POST
操作请求,因为它们提供了额外的安全层。
-
GET
用于获取数据。GET
请求应该是幂等的,这意味着它们不会引起任何副作用,无论它们被发出多少次。当您通过在浏览器中键入URL
或单击链接来访问网站时,您正在发出GET
请求。 -
POST
用于将要处理的数据提交到指定资源。POST
请求可以更改服务器的状态,例如创建新帐户或进行购买。
避免使用 GET 状态更改操作的原因:
-
可预测性:如果使用可预测的
GET URL
执行操作,攻击者可以构建恶意链接,当受害者单击这些链接时,会在对受害者进行身份验证的目标站点上触发不需要的操作。 -
更容易欺骗用户:诱骗用户点击链接(
GET
请求)比诱骗他们提交表单(通常是POST
请求)更容易。例如,攻击者可以在带有源URL
的论坛帖子中嵌入图像标签,从而触发有害GET
操作。 -
浏览器历史记录:
GET
请求及其参数存储在浏览器历史记录中。如果这些请求更改了应用程序的状态,则意味着从历史记录中重新访问该URL
可能会无意中再次触发该操作。
用于 POST 状态更改操作的好处:
-
防止意外点击:不能仅通过单击链接来诱骗用户发出
POST
请求。他们通常必须提交表格,这是一个更有意的行为。 -
使用反
CSRF
令牌:POST
请求允许在请求中嵌入反CSRF
令牌(通常在表单中),从而增加额外的安全层来防止CSRF
攻击。
保留 GET
数据检索和用于 POST
操作不仅有利于安全性,而且还遵循使 Web
行为可预测和可理解的原则。坚持 HTTP
方法的预期用途可以带来更好的用户体验和更高的安全性。
原文链接
转载自:https://juejin.cn/post/7379060488351465482