CSRF(Cross-Site Request Forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。CSRF通过伪装为授权用户的请求来攻击授信网站的恶意漏洞。简单来说就是攻击者盗用了你的身份,以你的名义发送恶意请求。

攻击思路
与跨站脚本(XSS)不同的是,XSS利用站点内的信任用户。因此XSS容易发现,因为攻击者需要登录后台完成攻击。管理员是可以通过查看日志发现攻击者。
XSS:攻击者发现XSS漏洞 > 构造代码 > 发送给受害人 > 受害人打开 > 攻击者获取受害人的Cookie > 完成攻击
而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。因此CSRF攻击一直都是管理员自己完成的,攻击者只负责了构造代码。CSRF少了一个获取受害人的Cookie的步骤,受害人在执行代码的时候就已经完成的攻击,而攻击者并没有参与进来。
CSRF:攻击者发现CSRF漏洞 > 构造代码 > 发送给受害人 > 受害人打开 > 受害人执行代码 > 完成攻击

攻击流程
CSRF中攻击者通过用户的浏览器来注入额外的网络请求,来破坏一个网站会话的完整性。浏览器安全策略允许当前页面发送到任何地址的请求,意味着当用户在浏览无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。
网络连接
如果攻击者无法直接访问防火墙内的资源,他可以利用防火墙内用户的浏览器间接的对他所想访问的资源发送网络请求。甚至还有这样一种情况,攻击者为了绕过基于IP地址的验证策略,利用受害者的IP地址来发起他想发起的请求。获知浏览器的状态
当浏览器发送请求时,通常情况下,网络协议里包含了浏览器的状态。这其中包括很多,比如cookie,客户端证书或基于身份验证的header。因此,当攻击者借助浏览器向需要上述这些cookie,证书和header等作验证的站点发送请求的时候,站点则无法区分真实用户和攻击者。改变浏览器的状态
当攻击者借助浏览器发起一个请求的时候,浏览器也会分析并相应服务端的Response。如果服务端的Response里包含有一个Set-Cookie的Header,浏览器会响应这个Set-Cookie并修改存储到本地的Cookie中。
例如:登录攻击
攻击者利用用户在可信网站的用户名和密码来对网站发起一个伪造请求。一旦请求成功,服务器端就会响应一个Set-Cookie的Header,浏览器接收到以后就会建立一个session cookie,并记录用户的登陆状态。这个session cookie被用作绑定后续的请求,因而也可被攻击者用来作为身份验证。
例如:搜索记录
受害人访问攻击者的网站,攻击者向谷歌伪造一个跨站点请求的登陆框,造成受害者被攻击者登陆到谷歌。随后,受害者使用搜索的时候,搜索记录就被攻击者记录下来。
很多搜索引擎包括谷歌和雅虎等允许用户选择是否同意保存搜索记录,并且为用户提供一个接口来查看他们自己的私人搜索记录。搜索请求里面包含了用户的行为习惯和兴趣的一些敏感细节,攻击者可以利用这些细节来欺骗用户,盗窃用户的身份或者窥探用户。当攻击者以用户身份登陆到搜索引擎里,就可以看到用户的搜索记录。

攻击防范
Laravel通过自带的CSRF保护中间件避免应用遭受攻击,Laravel会自动为每个被应用管理的有效会话生成一个CSRF令牌,然后将CSRF令牌保存到Session中,CSRF令牌用于验证授权用户和发起请求的请求者是否同一个人。
当使用HTML表单时必须在表单中引入CSRF令牌字段,这样CSRF保护中间件才能对请求进行验证。Lavarel模板引擎中可使用@csrf指令生成令牌的隐藏字段。
<form class="m-t" role="form" method="post" action="{{route('signin')}}">
@csrf
<div class="form-group">
<input type="text" class="form-control" placeholder="账户" name="username" required/>
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="密码" name="password" required/>
</div>
<button type="submit" class="btn btn-primary block full-width m-b">登录</button>
</form>
@csrf指令会被转换为名为_token的隐藏文本域
<input type="hidden" name="_token" value="u1e9l60l7J4nqpVu5MZloTVh62cSMVvuVmi65dcp"/>
默认app\Http\Kernel