首页 > 代码库 > CSRF跨站点请求伪造漏洞问题

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插入以下代码

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

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

<input type="hidden" name="__hash__" value="http://www.mamicode.com/11f6b3285bf71a87811c3dadccb7b166_c6694a7c3a76bbf9ac7bf66a77d87310" />这个。

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

C(‘TOKEN_ON’,false);$this->display();

 

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

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

上面的$Data是model

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

 

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