我一直在使用PHP做我自己的CSRF保护。从我所读到的内容来看,我决定使用cookie来实现我的保护,但对于我的方法是否能安全抵御CSRF攻击感到有点困惑。
因此,我的方法如下:
>
用户发送登录请求
服务器检查是否设置了CSRF令牌,如果未设置,则创建一个,并将其存储在会话中,并使用令牌创建Cookie
通过检查CSRF令牌是否在POST请求中进行验证,如果不在POST请求中,则检查$\u COOKIE中的令牌
如果令牌无效,请发回消息。。。
我决定使用cookie来存储令牌,因为这将适用于Ajax请求,并且我不必每次使用Ajax帖子时都包含它。
我感到困惑的是,攻击者不能仅仅发出请求;POST或GET,因为cookie在那里,所以它只是随请求一起发送,因此作为有效的请求,因为令牌每次都随浏览器一起发送?
只要“用户发送登录请求”指的是登录页面的初始GET请求,这是正确的。CSRF应在GET请求中生成和存储,并在每次发布期间进行验证。
我感到困惑的是,攻击者不能仅仅发出请求;POST或GET,因为cookie在那里,所以它只是随请求一起发送,因此作为有效的请求,因为令牌每次都随浏览器一起发送?
是的。CSRF令牌不是秘密的。他们只是确认只有在发出预期的GET请求后才会发出POST。这意味着只有当某人首先要求提交表格时,他们才能提交表格。它防止一个坏网站发送用户到您的网站与POST。它不会阻止攻击者发出GET请求、获取令牌和生成有效的POST。
来自OWASP:
在社交工程的一点帮助下(例如通过电子邮件或聊天发送链接),攻击者可能会欺骗网络应用程序的用户执行攻击者选择的操作。如果受害者是普通用户,成功的CSRF攻击会迫使用户执行状态更改请求。
cookie不应包含CSRF令牌。只有客户端会话存储应该包含它。你不应该反对cookie中的CSRF。
如果您要检查与cookie一起发送的CSRF,您将绕过CSRF背后的想法。
一个简单的攻击场景是在国外网站上隐藏的形式:
<form method="method" action="http://site-to-gain-access-to.tld/someactionurl">
<!-- some form data -->
</form>
这个隐藏的表单将使用javascript执行,无需用户干预。如果用户登录到站点以获得访问权限。tld
如果没有激活的CSRF保护,那么就好像用户本身触发了该操作一样,因为用户的会话cookie将随该请求一起发送。因此服务器会假定是用户触发了该请求。
如果您现在将CSRF令牌放在cookie中,您将面临与会话相同的问题。
CSRF令牌必须始终仅作为请求正文或url的一部分发送,而不是作为cookie发送。
因此,突出显示的部分:
服务器检查是否设置了CSRF令牌,如果未设置,则创建一个,并将其存储在会话中,并使用令牌创建Cookie
通过检查CSRF令牌是否在POST请求中进行验证,如果不在POST请求中,则检查$\u COOKIE中的令牌
会破坏CSRF的保护。无论CSRF是以明文还是服务器端加密的形式存储在cookie中,都没有关系。
CSRF是指针对Web应用程序的跨站点伪造攻击。 CSRF攻击是系统的经过身份验证的用户执行的未授权活动。 因此,许多Web应用程序容易受到这些攻击。 Laravel以下列方式提供CSRF保护 - Laravel包含一个内置的CSRF插件,可为每个活动用户会话生成令牌。 这些令牌验证相关的经过身份验证的用户是否发送了操作或请求。 实现 (Implementation) 本节将详细讨论Laravel
简介 Laravel 可以轻松地保护应用程序免受 跨站点请求伪造 (CSRF) 攻击,跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。 Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。 无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,
问题内容: Django随附CSRF保护中间件,该中间件生成用于表单的唯一每次会话令牌。它扫描所有传入的请求以获取正确的令牌,如果令牌丢失或无效,则拒绝该请求。 我想对某些POST请求使用AJAX,但表示请求没有CSRF令牌。这些页面没有任何要钩的元素,我宁可不要弄混将标记作为隐藏值插入的标记。我认为实现此目的的一种好方法是公开vew,以返回用户的令牌,这依赖于浏览器的跨站点脚本编写规则来防止恶意
我目前添加了一个CSRF令牌保护机制到我的php应用程序。正如我所读到的,唯一的要求是一个独特的每个用户令牌,我在php7中使用random_bytes生成。 我担心的是,如果攻击者使用用户的浏览器发送http请求,浏览器不会发送令牌的会话变量吗?(因为用户具有与令牌关联的sessionid)。 我将令牌存储在会话变量的一个隐藏值内。 例如:我的令牌存储在会话变量中,然后攻击者将我发送到具有csr
我正试图用crsf令牌保护我的Zend表单。如果我在表单中添加token元素,它总是会向我返回notEmpty错误消息。我做错什么了吗?谢谢 控制器中的操作: 在我看来,我呈现表单并转储错误消息 每次验证表单后,我都会收到如下错误消息: 如果我给元素填充了正确的值,最后一个错误总是token-NotEmpty,因此我的表单永远无效。