csrf

跨站点请求伪造预防备忘单

介绍

跨站点请求伪造 (CSRF) 是一种攻击,当恶意网站、电子邮件、博客、即时消息或程序导致用户的 Web 浏览器在用户经过身份验证时在受信任的站点上执行不需要的操作时,就会发生这种攻击。CSRF 攻击之所以有效,是因为浏览器请求自动包含所有 cookie(包括会话 cookie)。因此,如果用户通过了站点的身份验证,站点将无法区分合法的授权请求和伪造的经过身份验证的请求。当使用正确的授权时,这种攻击就会被阻止,这意味着需要一个挑战-响应机制来验证请求者的身份和权限。

成功的 CSRF 攻击的影响仅限于易受攻击的应用程序暴露的功能和用户的权限。例如,这种攻击可能会导致资金转移、更改密码或使用用户的凭据进行购买。实际上,攻击者使用 CSRF 攻击使目标系统在受害者不知情的情况下通过受害者的浏览器执行功能,至少在未经授权的交易提交之前是这样。

    

CSRF 和 X-CSRF-Token 的区别

CSRF 保护有多种方法。

传统方式(“同步器令牌”模式)通常涉及为每个请求设置唯一的有效令牌值,然后在随后发送请求时验证该唯一值。通常通过设置隐藏表单字段来完成。令牌值通常是短暂的并与该会话相关联,因此如果黑客尝试重用他们之前在页面上看到的值,或者尝试猜测该值,他们可能会失败。因此,只有来自您的应用程序的请求才有效,来自应用程序/域外部的伪造请求(也称为跨站点请求伪造)将会失败。

什么是CSRF令牌,它如何工作?

许多现代的Web框架(如Laravel或Play框架)都具有内置支持,可保护您的Web应用程序免受跨站点请求伪造  (CSRF)的侵害  。这是一件好事,但是并不是每个开发人员何时以及如何使用它都总是不清楚。在本文中,我尝试给出一些(希望)易于理解的答案。

在潜入之前,让我们提醒自己一些规则和限制:…

    

php设置samesite cookie,有效防止CSRF

php设置samesite cookie,支持所有PHP版本。

PHP 7.3 的setcookie函数已经支持samesite属性,但对于7.3以下版本,可以用以下函数代替:

<?php
$options = [
    'expires' => time()+18400,
    'domain' => 'localhost',
    'httponly' => false,
    'samesite' => 'Lax',
    'secure' => false,
    'path' => '/'
  ];

function samesite_setcookie($name, $value, array $options)
{
    $header = 'Set-Cookie:';
    $header .= rawurlencode($name) 
                

跨站请求伪造与 Same-Site Cookie

跨站请求伪造

跨站请求伪造(又被称为 CSRF 或者 XSRF ),它源自一个域网站向另一个域网站发起请求的简单功能。攻击者通过一些技术手段欺骗用户使用浏览器去访问一个自己曾经认证过的网站并执行一些敏感操作(如转账)。

一个域网站向另一个域的网站发起请求的方式有很多,例如点击一个超链接、加载静态资源、提交表单以及直接发起 ajax 请求等。如:

<a href="http://a.com/xx">点击有惊喜</a>    # 诱导用户点击

<img src="http://a.com/xx" >     # 浏览器默认加载资源 - 图片

<link href="http://a.com/xx" rel="stylesheet" >
        

跨站请求伪造已死!

跨站请求伪造已死!

在连续不断的被跨站请求伪造折磨了这么多年后,我们现在终于有了一个合理的解决方案。一个对网站拥有者没有技术负担、实施起来没有难度、部署又非常简单的方案,它就是 Same-Site Cookies。

和互联网历史一样悠久的跨站请求伪造

跨站请求伪造(又被称为 CSRF 或者 XSRF )似乎一直都存在着。它源自一个网站必须向另一个网站发出请求的简单功能。比如像在页面中嵌入下面的表单代码。

<form action="https://your-bank.com/transfer" method="POST" id="stealMoney">  
<input type="hidden" name="to" value="Scott Helme">  
<input type="hidden" name="account" value="14278935">  
<input type="hidden" name="amount" value="£1,000">复制代码

当你的浏览器载入这个页面之后,上面的表单将会由一个简单的 JS 片段来实现提交。

document.getElementById("stealMoney").submit();复制代码
        

再见,CSRF:讲解set-cookie中的SameSite属性

SameSite-cookies是一种机制,用于定义cookie如何跨域发送。这是谷歌开发的一种安全机制,并且现在在最新版本(Chrome Dev 51.0.2704.4)中已经开始实行了。SameSite-cookies的目的是尝试阻止CSRF(Cross-site request forgery 跨站请求伪造)以及XSSI(Cross Site Script Inclusion (XSSI) 跨站脚本包含)攻击。详细介绍可以看这一篇文章(https://tools.ietf.org/html/draft-west-first-party-cookies-06)。…