当前位置: 路由器之家 > 路由器安全 >

【路由器安全】HTTP路由实例教程(三)—— CSRF攻击原理及其防

时间:2017-09-30 09:02:41 作者:路由君 来源:路由器之家
本文是路由器之家为你分享的关于《【路由器安全】HTTP路由实例教程(三)—— CSRF攻击原理及其防护-黑客,攻击》教程,属于路由器安全防范方面,主要是讲解【路由器安全】HTTP路由实例教程(三)—— CSRF攻击原理及其防护-黑客,攻击的路由器设置方法或其他路由器知识点,下面是详细的讲解,希望能够对你有所帮助。

Laravel中避免CSRF攻击

1、什么是CSRF攻击

CSRF是跨站请求伪造(Cross-site request forgery)的英文缩写。关于CSRF攻击原理及其防护,可查看Github上的这个项目:理解CSRF,说得比较详细和透彻。

2、Laravel中如何避免CSRF攻击

Laravel框架中避免CSRF攻击很简单:Laravel自动为每个用户Session生成了一个CSRF Token,该Token可用于验证登录用户和发起请求者是否是同一人,如果不是则请求失败。

Laravel提供了一个全局帮助函数来获取该Token值,因此只需在视提交图表单中添加如下HTML代码即可在请求中带上Token:

该段代码等同于全局帮助函数的输出:

在Blade模板引擎中还可以使用如下方式调用:

{!! csrf_field() !!}

测试代码

我们在routes.php中定义如下代码:

Route::get('testCsrf',function(){
    $csrf_field=csrf_field();
    $html=<<
            {$csrf_field}
            
        
GET;
    return $html;
});

Route::post('testCsrf',function(){
    return 'Success!';
});

在浏览器中我们输入,点击“Test”按钮,浏览器输出:

Success!

则表示请求成功,否则,如果我们定义GET路由如下:

Route::get('testCsrf',function(){
    $html=<<
            
        
GET;
    return $html;
});

则点击“Test”按钮,则抛出异常。

3、从CSRF验证中排除指定URL

并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。

可以通过在()中间件中将要排除的请求URL添加到属性数组中:


这样我们刷新页面,再次在页面中点击“Test”按钮,则页面不会报错,正常输出如下内容:

Success!

4、X-CSRF-Token及其使用

如果使用Ajax提交POST表单,又该如何处理呢?我们可以将Token设置在meta中:

然后在全局Ajax中使用这种方式设置请求头并提交:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Laravel的中间件会检查请求头,如果该值和Session中CSRF值相等则验证通过,否则不通过。

5、X-XSRF-Token及其使用

除此之外,Laravel还会将CSRF的值保存到名为的Cookie中,然后在中间件验证该值,当然,我们不需要手动做任何操作,一些JavaScript框架如Angular会自动帮我们实现。

6、Laravel中CSRF验证原理分析

说了这么多使用方式,接下来我们来分析下源码,看看Laravel底层到底是如何避免CSRF攻击的:

1)首先Laravel开启Session时会生成一个token值并存放在Session中(第90行方法),对应源码如下:

public function start()
{
    $this->loadSession();

    if (! $this->has('_token')) {
        $this->regenerateToken();
    }

    return $this->started=true;
}

2)然后重点分析中间件的方法,该方法中先通过方法判断请求方式,如果请求方法是、、其中一种,则不做CSRF验证;

3)再通过方法判断请求路由是否在属性数组中进行了排除,如果做了排除也不做验证;

4)最后通过方法判断请求参数中的CSRF TOKEN值和Session中的Token值是否相等,如果相等则通过验证,否则抛出异常。

对应源码如下:

public function handle($request, Closure $next)
{
    if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

注:方法首先从Request中获取参数值,如果请求中不包含该参数则获取请求头的值,如果该请求头也不存在则获取请求头的值,需要注意的是请求头的值需要调用的方法进行解密。

上一篇:【路由器安全】家用路由器的安全进化史-黑客,攻击

下一篇:【路由器安全】理论变现实 黑客可用网页入侵路由器-黑客,攻击

最新教程
  • 1由贸易争端浅谈专利和知识产权的保护
  • 2中国专利(知识产权)大跃进中应避免的问题
  • 3美国芯片断供,是中国的挑战也是机会 芯片系
  • 4以自身所见告诉你一个真实的华为
  • 5手机市场遇寒冬 一季度iPhone印度出货量暴跌4
  • 6德国5G套餐每月657元不限流量 中国料将在合理
  • 7魔术家无线路由器怎么设置 两种方法让你设置
  • 8荣耀9X将于7.23在西安发布
  • 9192.168.0.1路由器设置修改密码方法大全
  • 10有线or无线充电 你该如何选择手机充电方式?
  • 11数码科技改写企业生态 近8成CEO忧心员工缺乏
  • 12英国运营商EE公布5计划 由华为和HTC组成
  • 13路由器天线上套2个烟盒 就能发挥大作用
  • 14中移动质量报告:小米路由器Mesh综合评价第一
  • 15开源路由器项目OpenWrt18.06.4版于近日发布
  • 热门教程
  • 1192.168.0.1路由器设置修改密码方法大全
  • 2路由器天线上套2个烟盒 就能发挥大作用
  • 3无线路由器设置好了上不了网的解决方法图文教
  • 4输入192.168.1.1进去的是中国电信天翼宽带解
  • 5拉别人的网线怎么设置路由器 开通wifi上网
  • 6怎样连接无线路由器 图文教程来帮你
  • 7电视机5G wifi信号能否连接的判断方法
  • 8电脑连5g连不上 原因分析和解决方法
  • 9路由器的5g怎么设置 看这里就秒懂
  • 105g辐射量会变大吗? 权威回应来了
  • 115g网络需要换手机吗 手机得换 号不用换
  • 12优酷路由宝怎么设置 图文教程来帮你
  • 13路由器网址打不开 3个常见原因及解决方法
  • 14手机打不开falogin.cn的解决方法
  • 15腾达路由器限速的设置方法图文教程