CSRF跨站点请求伪造漏洞问题

Posted cccccccccc丶航航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF跨站点请求伪造漏洞问题相关的知识,希望对你有一定的参考价值。

最近在写php,项目写完后送检发现一个漏洞问题CSRF,强行拖了我一天的时间,沉迷解决问题,茶饭不思,日渐消瘦,时间比较赶,这篇比较糙,凑合看下。

好了废话不多说下面是今天的解决方案。

博主用的是Thinkphp框架,发现这个问题的时候第一件事就是去查下相关资料,发现发现网上说可以通过表单令牌来解决这个问题。

如果不设置表单令牌,很容易导致CSRF(跨站请求伪造)、跨站提交表单。

表单令牌是一种非常实用的技术(博主ps:其实鸡肋),它在表单的视图部分生成随机令牌,默认为随机的MD5串,存在hidden的input中。在表单数据提交前,将提交的数据与SESSION中存放的令牌进行比对,从而判断是否是跨站提交。

ThinkPHP中开启表单令牌的方式比较简单,在config中进行配置(博主的路径:项目/Home/Conf/config.php):

        ‘TOKEN_ON‘=>true,  // 是否开启令牌验证
    ‘TOKEN_NAME‘=>‘__hash__‘,    // 令牌验证的表单隐藏字段名称
    ‘TOKEN_TYPE‘=>‘md5‘,  //令牌哈希验证规则 默认为MD5
    ‘TOKEN_RESET‘=>true,  //令牌验证出错后是否重置令牌 默认为true    

添加完成上面的代码后还需要在tags.php配置一波。ps:有的小伙伴没有tags.php可以在项目/Common/Conf目录下新建一个tags.php插入以下代码

<?php
return array(
    //‘配置项‘=>‘配置值‘
    ‘view_filter‘=>array(‘Behavior\TokenBuildBehavior‘),
);

然后你就可以在你的所有表单页面看到

<input type="hidden" name="__hash__" value="11f6b3285bf71a87811c3dadccb7b166_c6694a7c3a76bbf9ac7bf66a77d87310" />这个。

如果你只想在部分页面的表单加入表单令牌你可以:

C(‘TOKEN_ON’,false);

$this->display();

 

配置完成后在你的表单提交地址指向的方法里面加入下面代码:

if(!$Data->autoCheckToken($_POST)){  
           $this->error(‘非法登陆!‘);
           }

上面的$Data是model

今天先写到这里要写代码了。

 

以上是关于CSRF跨站点请求伪造漏洞问题的主要内容,如果未能解决你的问题,请参考以下文章

CSRF | 强大的防御跨站点请求伪造

CSRF(跨站请求伪造)

深入解析跨站请求伪造漏洞:原理剖析

深入解析跨站请求伪造漏洞:实例讲解

如何解决跨站点请求伪造

CSRF(跨站请求伪造攻击)漏洞详解