最近在写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('BehaviorTokenBuildBehavior'), );
然后你就可以在你的所有表单页面看到
<input type="hidden" name="__hash__" value="11f6b3285bf71a87811c3dadccb7b166_c6694a7c3a76bbf9ac7bf66a77d87310" />这个。
如果你只想在部分页面的表单加入表单令牌你可以:
C(‘TOKEN_ON’,false); $this->display();
配置完成后在你的表单提交地址指向的方法里面加入下面代码:
if(!$Data->autoCheckToken($_POST)){ $this->error('非法登陆!'); }
上面的$Data是model
今天先写到这里要写代码了。