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

智能推荐

基于SSM和MySQL的企业人事管理系统的设计与实现_基于ssm的企业人事管理系统的设计与实现参考文献-程序员宅基地

文章浏览阅读484次,点赞2次,收藏2次。管理员进入主界面,软件开始运行,提供用户登录功能,不同的用户登录操作的功 能不同,非管理员用户登录只能查看一些公告信息等,而管理员登录后,可以进行用户 管理丶部门管理、职位管理、员工管理、公告管理等功能。基于其他企业人事管理软件的不足,要求能够制作一个可以方便、快捷的对员工信 息进行添加、修改、删除的操作,为了能够更好的存储职工的信息,可以将职工的信息添 加到 Word 文档,这样,不但便于保存,还可以通过 Word 文档进行打印。员工信息的管理:维护员工的基本信息,用户可以进行员工档案信息的录入及更改,_基于ssm的企业人事管理系统的设计与实现参考文献

【C语言】手撕二叉树

【C语言】手撕二叉树

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算,表达式执行的入口和计算逻辑都是统一的,这里已投影为分析表达式执行的流程。

hive启动beeline报错

出现上面的问题执行以下代码。

【Hadoop】-Hive客户端:HiveServer2 & Beeline 与DataGrip & DBeaver[14]

DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。3、连接成功,在里面我们可以看到我们前面章节所创建的表,这样子就可以在里面操作我们的sql语句的。5、连接成功,在里面我们可以看到我们前面章节所创建的表,这样子就可以在里面操作我们的sql语句的。

java lambda无法使用_java – 为什么不允许lambda函数?-程序员宅基地

文章浏览阅读1.2k次。我一直在Vaadin的GUI中工作,有一些来自我的IT主管的课程.这一切都很棒,但是,今天,我遇到过我不能在addListener方法类型中使用lambda表达式.此方法是自定义的,作为使用它的对象.这是实施:public class ResetButtonForTextField extends AbstractExtension {private final List listeners= n..._java: -source 1.5 中不支持 lambda 表达式

随便推点

wetrtc简介

wetrtc简介

单片机基于ST25DV动态标签的无线通信_st25dv能量采集-程序员宅基地

文章浏览阅读651次。利用I2C有线链路,任何NFC智能手机或NFC/RFID HF专业读卡器以及MCU均可以访问存储在这些标签中的数据,并且支持掉电保存。这些标签的集成度和性价比极高,可提供丰富的功能集,适用于各种应用。此外,开发人员可从评估板、软件工具、移动应用和其他资源构成的完整生态系统中受益,从而加快应用开发速度。在物联网产品的开发过程中,物联网设备非接触式向外界提供可变的交换信息非常有必要,比如路由器向手机提供可配置的WiFi信息,巡检点向手机提供动态的传感器数据等等。_st25dv能量采集

自己搭建 Linux 服务器踩坑记录_建立服务器踩过的坑-程序员宅基地

文章浏览阅读149次。前言妈蛋,自己搭建一个Linux服务器居然能遇到这么多坑。特此整理下,方便下次遇到同样的错误时能够回过头来快速定位问题并解决问题Number 1,服务器重启之后,Xshell 连接不上注:在服务器重启之前,我只安装了 jdk ,配置了 /etc/profile 环境变量,我一直以为是这个原因,后面把jdk 配置注释掉也没用正确的方向应该是先查看 ssh 服务有没有启动键入命令systemctl status sshd.service如果你的显示跟红框一样 【dead..._建立服务器踩过的坑

MT4606-VB_MOSFET产品应用与参数解析-程序员宅基地

文章浏览阅读187次。通过控制20Vgs (±V)的门源电压,可以实现开关管的导通和截止,实现对电流的控制和开关状态的转换。MT4606详细参数说明 - 极性 N+P沟道- 额定电压 ±30V- 额定电流 9A (N沟道), -6A (P沟道)- 导通电阻 15mΩ @ 10V (N沟道), 42mΩ @ 10V (P沟道), 19mΩ @ 4.5V (N沟道), 50mΩ @ 4.5V (P沟道)- 门源电压 20Vgs (±V)- 阈值电压 ±1.65Vth (V)- 封装类型 SOP8。_mt4606

达梦启云平台中,部署使用HIVE笔记_达梦sql中hiveing-程序员宅基地

文章浏览阅读637次。启云平台部署hive_达梦sql中hiveing

算法-前缀和与差分-程序员宅基地

文章浏览阅读606次,点赞27次,收藏14次。那么就可以把 preSum 的公式统一为,此时的 preSum[i] 表示 nums 中 iii 元素左边所有元素之和(不包含当前元素 iii)。​下面以 [1, 12, -5, -6, 50, 3] 为例,用动图讲解一下如何求 preSum。