当前位置: 首页 > 知识库问答 >
问题:

CSRF深度保护

张晨朗
2023-03-14

我目前添加了一个CSRF令牌保护机制到我的php应用程序。正如我所读到的,唯一的要求是一个独特的每个用户令牌,我在php7中使用random_bytes生成。

我担心的是,如果攻击者使用用户的浏览器发送http请求,浏览器不会发送令牌的会话变量吗?(因为用户具有与令牌关联的sessionid)。

我将令牌存储在会话变量的一个隐藏值内。

例如:我的令牌存储在会话变量中,然后攻击者将我发送到具有csrf保护的更改密码页面,验证将不会通过?(我的浏览器cookie中已经有正确的会话标识符)。

谢谢

共有1个答案

薄高懿
2023-03-14

以下是CSRF攻击的工作原理:

爱丽丝(有意无意地)访问compromised.com

遭到破坏。com向您的网站发出HTTP post†请求。com,使用HTML表单、JavaScript、Flash或任何可以发出HTTP post请求的东西。

<form method=post action="http://yoursite.com/change-password">
  <input name=password value=666>
  <input name=confirm_password value=666>
</form>

这是有效的,因为网络浏览器会将Alice的yoursite.com会话cookie发送到yoursite.com

由于同一原产地政策,受到损害。com可以向任何站点发送它想要的任何数据,但不能从其他站点读取数据。

以下是CSRF保护的工作原理:

yoursite。com需要一个名为\u csrf\u token(或类似)的HTTP post请求变量,并将其与服务器端会话内存中为Alice存储的内容进行比较。

您将\u csrf\u令牌的值写入HTML表单中的隐藏输入,因此它会自动与站点中的表单帖子一起发送。com

遭到破坏。com无法从您的站点读取\u csrf\u令牌的值。com由于同一来源的政策,因此它试图发布到您的站点。com将失败。

<form method=post action="http://yoursite.com/change-password">
  <input name=password value=666>
  <input name=confirm_password value=666>
  <input name=_csrf_token value="???">
</form>

†不必是post,但这很常见

 类似资料:
  • CSRF是指针对Web应用程序的跨站点伪造攻击。 CSRF攻击是系统的经过身份验证的用户执行的未授权活动。 因此,许多Web应用程序容易受到这些攻击。 Laravel以下列方式提供CSRF保护 - Laravel包含一个内置的CSRF插件,可为每个活动用户会话生成令牌。 这些令牌验证相关的经过身份验证的用户是否发送了操作或请求。 实现 (Implementation) 本节将详细讨论Laravel

  • 简介 Laravel 可以轻松地保护应用程序免受 跨站点请求伪造 (CSRF) 攻击,跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。 Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。 无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,

  • 我正试图用crsf令牌保护我的Zend表单。如果我在表单中添加token元素,它总是会向我返回notEmpty错误消息。我做错什么了吗?谢谢 控制器中的操作: 在我看来,我呈现表单并转储错误消息 每次验证表单后,我都会收到如下错误消息: 如果我给元素填充了正确的值,最后一个错误总是token-NotEmpty,因此我的表单永远无效。

  • 我正在测试一个web应用程序。CSRF在cookies和标头中应用和发送,但不是以隐藏输入的形式。csrf令牌不会针对每个请求更改,但会在会话期间更改。csrf令牌应多久更改一次?它应该根据会话或请求进行更改吗?客户端或服务器应该设置csrf令牌吗?应用csrf保护的最佳策略是什么?双重提交cookie?三重提交Cookie?还是其他新策略?

  • 目前我尝试使用Zend Framework 2的CSRF保护。 但每次我发送表单时,都会收到以下错误消息: 提交的表格不是来自预期的网站 我以这种方式实施了CSRF保护: 1)创建了一个Form Class并添加了csrf: 2)在view文件中呼应csrf元素: 我发现csrf令牌没有存储在会话中,但是为什么呢?

  • 示例: 爱丽丝通过浏览器登录到“https://example.com”(使用cookie)。我想,她使用的是现代浏览器。 爱丽丝访问“https://evil.com”,而evil.com的客户端代码对“https://example.com”执行某种请求(经典CSRF场景)。 所以: null null