ThinkPHP框架总结之安全及使用:
本片文章主要总结和介绍了使用TP过程中,加强项目安全的一些办法,具体是以例子为导向验证演示。
防止SQL注入:
针对WEB应用,防止SQL注入是首要考虑的安全问题,通常的安全隐患在于查询条件使用字符串参数,而且其中一些参数依赖于客户端输入,为了有效防止SQL注入,这里建议:
1、查询条件尽量使用数组方式,具体如下:
数组方式:
$wheres = array();
$wheres['account'] = $account;
$wheres['password'] = $password;
$User->where($wheres)->find();
2、如果必须使用字符串,那么建议使用预处理机制,具体如下:
$User = D('UserInfo');
$User->where('account="%s" andpassword="%s"',array($account,$password))->find();
3、可以使用PDO方式(绑定参数),因为这里未使用PDO,所以不罗列,感兴趣的读者可查询资料了解验证。
表单令牌验证:
TP框架支持对表单进行令牌验证功能,可以有效防止重复提交表单等安全问题。
1、如何启用表单令牌验证(默认是关闭的)
配置参数:
/* 表单令牌 */
'TOKEN_ON' => true,// 是否开启令牌验证
'TOKEN_NAME' => '__hash__', // 令牌验证的表单隐藏字段名称
'TOKEN_TYPE' => 'md5', // 令牌哈希验证规则默认为MD5
'TOKEN_RESET' => true// 令牌验证出错后是否重置令牌默认为true
这代表已经打开了表单令牌验证的开关,具体可查看注释说明。此时系统会自动在带有表单请求的模版文件中自动生成以TOKEN_NAME为名字的隐藏域,它的值是以TOKEN_TYPE规则的哈希字符串,用来实现表单的令牌验证。
注意:
如果模版文件中有多个表单,建议添加标志,只为需要验证的表单进行验证,如果不希望在某个页面表单验证,那么可以在控制器方法的输出语句前添加关闭验证表单命令:
C(“TOKEN_ON”,false);
$this->display();
2、表单令牌行为绑定
我的项目应用配置目录下,新建一tags.php文件,其中内容如下:
<?php
return array(
// 静态缓存写入时(行为绑定)
'view_filter' => array('Behavior\TokenBuild'),
// 如果是3.2.1以上版本需要改成
// 'view_filter' =>array('Behavior\TokenBuildBehavior'),
);
?>
存放位置:Project/Common/Conf/tags.php,代表执行到view_filter标签时执行表单令牌验证功能。
前端输入过滤:
客户端提交的数据存在不安全性,所以TP后台接口必须对提交的数据进行过滤,下面提供几点建议:
1、使用系统建议的I函数获得用户输入数据
2、开启表单令牌验证功能,如上表单令牌使用介绍
3、使用安全过滤函数,例如:stripslashes,htmlentities及strips_tags等
使用I函数过滤:
默认全局过滤->
/* 输入过滤 */
'DEFAULT_FILTER'=> 'strip_tags,stripslashes', // 全局的I函数过滤规则多个
个别数据过滤->
$account = I('post.account','','strip_tags'); // 用strip_tags过滤$_POST['account']
$password = I('post.password','','stripslashes'); // 用stripslashes过滤$_POST['password']
写入数据过滤:
如果没有使用I函数对数据过滤,那么可以在模型插入数据时过滤,具体如下:
$this->data($data)->filter('strip_tags')->add();
目录文件安全:
由于某些服务器开启了目录浏览权限,所以任何人都可以直接在浏览器中打开并访问对应目录,当然,系统默认开启了目录文件安全机制,会在自动生成目录时生成index.html空文件(默认名字,可以使用预定义语句:define(‘DIR_SECURE_FILENAME)’,’default.html’)设置名称),另外,还支持多个安全文件写入,用来满足不同服务器部署的要求(define(‘DIR_SECURE_FILENAME’,’index.html,index.htm’))。
注意:默认生成的安全文件中的内容为空字符串,我们可以设定默认的值,使用预定义语句:define(‘DIR_SECURE_CONTENT’,’Hello Secure file!’)。
表单合法性检测:
处理表单提交数据时,我们建议使用Think\Model类中的create方法创建数据对象,因为使用该方法时,系统会对数据的合法性进行检查。
1、配置insertFields和updateFields属性
class UserInfoModelextends Model {
// 数据表名字
protected $tureTableName ='user_info';
// 配置插入和修改的字段匹配设置(针对表单)
protected $insertFields =array('account','nickname','mobile');
protected $updateFields =array('nickname','mobile');
}
上面的定义之后,当我们使用了create方法创建数据对象后,再使用add方法插入数据时,只会插入上面配置的几个字段的值(更新类同),具体如下:
接口代码:
// 用户注册(示意性接口:插入)
public function register() {
// ...
// 使用Model的create函数更安全
$User= D('UserInfo');
$User->create();
$ID= $User->add();
if($ID) {
$result= $User->where('id=%d',array($ID))->find();
echo json_encode($result);
}
// ...
}
返回结果:
2、使用field方法直接处理
// 插入
M('User')->field('account,nickname,mobile')->create();
// 更新
M('User')->field('nickname,mobile’)->create();
上传文件安全:
Web网站上传文件存在安全隐患,所以需要对其进行安全检查和设置。系统TP提供的Think\Upload提供了对文件的类型、后缀、大小及上传文件的合法进行了检查,那么接下来需要确认相关的配置已经到位(后面总结文件上传时会详细介绍)。
防止XSS攻击:
XSS,跨站脚本攻击,可用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案:
• 直接过滤所有的JavaScript脚本;
• 转义Html元字符,使用htmlentities、htmlspecialchars等函数;
• 系统的扩展函数库提供了XSS安全过滤的remove_xss方法;
注意:新版对URL访问的一些系统变量已经做了XSS处理。
其他相关建议:
• 对所有公共的操作方法做必要的安全检查,防止用户通过URL直接调用;
• 不要缓存需要用户认证的页面;
• 对用户的上传文件,做必要的安全检查,例如上传路径和非法格式;
• 如非必要,不要开启服务器的目录浏览权限;
• 对于项目进行充分的测试,不要生成业务逻辑的安全隐患(很重要哦);
最后一点,做好服务器的安全防护;
技术讨论群:489451956(新)