ThinkPHP框架总结之安全及使用_thinkphp安全技术框架文档-程序员宅基地

技术标签: php  

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 UserInfoModelextendsModel {

     // 数据表名字

     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处理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/moliyiran/article/details/83900188

智能推荐

git编译报错解决-程序员宅基地

文章浏览阅读939次。git configure 配置时没有设定--with-curl --with-expat 造成首先确定是否安装curl包:rpm-qa|grepcurl如果没有安装,一定要安装:yuminstall-ycurlcurl-devel安装完成后,删除原安装目录和编译目录,重新解压缩:tar-zxfgit-2.9.2.tar.gz-C/tmp/cd/..._--with-curl失败

Johnson算法:多源最短路算法-程序员宅基地

文章浏览阅读304次。Johnson算法请不要轻易点击标题一个可以在有负边的图上使用的多源最短路算法时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\)空间复杂度\(O(n+m)\)这个神奇的算法综合利用了Dijkstra算法和Bellman-Ford算法(不要慌,虽然有负边但Dijkstra可以跑!)在开始讲解之前,我们将其与floyd进行比较\(flo..._多源最短路的最优复杂度

JTopo + Vue 实现自定义拖拽流程图_vue拖拽流程图-程序员宅基地

文章浏览阅读8.2k次,点赞32次,收藏42次。JTopo + Vue 实现自定义拖拽流程图 市场上做流程图的插件比较多,这里介绍一种基于canvas编写的js插件,结合vue框架做出精美的流程图 首先搭建vue框架,这里就不做介绍,由于jtopo官方demo里用到了jquery,所以我的项目里也引用了jquery插件,鉴于这里用到了很多的dom操作,所以建议大家也直接引用jquery进行操作; 然后将jtopo.js下载到本地,放到自己的vue项目的静态文件目录下,如下图: ![vue引入jtopo.js](https://im_vue拖拽流程图

C语言 实现字符串的复制 char * str_copy_char copy-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏7次。编写一个函数,实现字符串的复制,函数首部定义为:char*str_copy(char*d,char*s)函数功能为:将第二个参数s所表示的字符串复制到第一个参数d所表示的字符串中,函数返回值为第一个参数的值。请写出完整的函数,并写出主函数,对该函数进行验证。说明:本题不允许使用string.h中的标准函数,不允许改变函数首部char * str_copy1(char *d, char *s);char * str_copy2..._char copy

webgl 学习心得_webgl心得体会-程序员宅基地

文章浏览阅读1.2k次。我本是搞Android 的,公司需要就搞3D展示了,刚开始找了很多资料,觉得threejs最为适合我,原因是我会点前端的东西,threejs也比较简单,demo也齐全;但是,由于公司没有真正的UI,全凭老板一句话,你们懂得,修修改改,晚上学习,白天实现功能,搞了几个月,实现的功能有,导入3d文件,展示楼层,设备参数展示,报警,位置提醒这些主要的功能,又感觉不满意,想要bim功能,又想要游戏效果,其..._webgl心得体会

【Allegro】关于焊盘与封装制作_anti-pad-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏15次。焊盘焊盘类型:规则焊盘(Regular Pad),反焊盘(Anti-Pad),热风焊盘,不规则焊盘。Regular Pad规则焊盘,即与元器件管脚焊接的有规则形状的焊盘。Anti-Pad反焊盘,使引脚和周围的铜区域不连接。Thermal Relief又称为花焊盘,热风焊盘,它的主要作用通过减少焊盘与电源和地层敷铜区的连接面积而防止焊接时焊盘散热太快不好焊。热风焊盘需要现在alleg..._anti-pad

随便推点

随笔---数据库索引总结_模糊查询 半包走索引-程序员宅基地

文章浏览阅读128次。建立索引的目的:加快查询的效率,当查询多于增删操作,适用于建立索引,建立索引的列,一旦进行增删改会进行索引的维护,也不宜大量建索引,索引会占用磁盘空间。建立索引的地方:数据库以查询为主,在经常查询的列上需要join的字段上,join的字段类型也应该相同多个列建立索引,能满足最左前缀原则主键,外键建立索引确保索引的唯一性数据长度较小的列,索引文件小如果一个列是比较长的字符串,为了加快这..._模糊查询 半包走索引

MySQL5.6 PERFORMANCE_SCHEMA 说明_mysql 5.6 关闭performance部分功能-程序员宅基地

文章浏览阅读1k次。背景: MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,需要手动开启,在配置文件里添加:[mysqld]performance_schema=ON_mysql 5.6 关闭performance部分功能

css首行缩进(css首行缩进)-程序员宅基地

文章浏览阅读7.1k次,点赞4次,收藏22次。首行缩进连个字符和首行缩进连个字是一样的概念?首行缩进连个字符和不一样的概念啊,字符和字是不一样的如何在css中控制段落的首行缩进??如何在css中控制段落的首行style="text-indent:24px"……控制段落缩进,24px是缩进距离……#####例如,拿你说的话举例:css中,我想..._css 首行缩进一个字

浏览器无法连接到代理服务器解决办法-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏3次。工具:WIN10 IE浏览器故障如图:方法如下:1.点击转到代理2.关闭-使用代理服务器3.刷新浏览器页面或重启浏览器_浏览器无法连接到代理服务器

echarts图表x轴数据太多显示不全的问题_echarts x轴内容太多 label 不显示后 图上的点就没了-程序员宅基地

文章浏览阅读1.8w次,点赞10次,收藏15次。问题如图,x轴数据条数过多可能导致x轴显示不全,开始我使用下面方法xAxis: { type: "category", min: min, max: max, data:time, axisLabel: { interval:num,//interval为x轴两..._echarts x轴内容太多 label 不显示后 图上的点就没了

layui对单选框radio设置不可编辑使用attr("disabled")没有效果_layui .attr-程序员宅基地

文章浏览阅读9.3k次,点赞4次,收藏3次。颜色变成灰色。并且鼠标碰上去是红色的禁用图标<div class="layui-form-item"> <label class="layui-form-label wide"><i class="redstar">*</i>定时公布答案与奖品</label> ..._layui .attr

推荐文章

热门文章

相关标签