ITPub博客

首页 > 大数据 > 数据挖掘 > ThinkPHP3.1编程之:安全(一)

ThinkPHP3.1编程之:安全(一)

数据挖掘 作者:louie0410 时间:2013-05-28 16:30:00 0 删除 编辑

今天为大家总结关于完全的问题,希望大家喜欢。在开发过程中,除了确保业务逻辑没有安全隐患外,应该充分了解和利用框架内建的安全机制或者工具来确保应用以及服务器的安全性,下面我们总结下ThinkPHP中涉及到的安全机制。系统安全系统安全指ThinkPHP可以配合的服务器的安全部署策略。应用部署建议

首先,我们建议在条件允许的情况下,把框架目录和项目目录都部署在非WEB访问目录下面,ThinkPHP的访问机制完全支持框架和项目的非WEB目录访问,你只需要把入口文件和资源(主要是指JS、样式和图片文件)目录放置于WEB目录下面即可。因此,建议的部署目录如下:

index.php 项目入口文件 Public/ 项目资源文件目录    Js/ JS目录    CSS/ 样式文件目录    Images/  图像文件目录 protected/ (受保护的目录,可以部署到非WEB目录或者设置安全访问)    ThinkPHP/ 框架系统目录    App/ 项目目录    Uploads/ 项目上传目录系统安全设置

如果你已经通过部署策略设置了系统目录安全访问的话,则可以跳过这段。如果你无法完全做到上述的服务器目录安全保护,也无需担心,ThinkPHP仍然可以通过设置确保你的目录安全。框架的核心文件本身已经做了访问判断,所有核心文件均不能直接在URL中被访问,因此也不用担心直接访问某些文件导致的错误暴露你的服务器路径之类的信息。对于应用目录,系统则提供了目录安全访问机制,你可以在第一次生成项目目录结构之前,在入口文件中添加:

define('BUILD_DIR_SECURE', true);

运行项目后会自动给项目的相关目录生成目录安全文件(在相关的目录下面生成空白的htm文件),并且可以自定义安全文件的文件名 DIR_SECURE_FILENAME ,默认是index.HTML,如果你想给你们的安全文件定义为default.html可以使用

define('DIR_SECURE_FILENAME', 'default.html');

还可以支持多个安全文件写入,例如你想同时写入index.html和index.htm 两个文件,以满足不同的服务器部署环境,可以这样定义:

define('DIR_SECURE_FILENAME', 'index.html,index.htm');

默认的安全文件只是写入一个空白字符串,如果需要写入其他内容,可以通过DIR_SECURE_CONTENT参数来指定,例如:

define('DIR_SECURE_CONTENT', 'deney Access!');

下面是一个完整的使用目录安全写入的例子

define('BUILD_DIR_SECURE',true); define('DIR_SECURE_FILENAME', 'index.html'); define('DIR_SECURE_CONTENT', 'deney Access!');

除了目录安全之外,还需要保护模板文件不被直接访问,因为有可能会在模板文件中暴露数据表的字段信息。解决办法是配置.htaccess文件(针对Apache服务器,其他服务器参考修改),把以下代码保存在项目的模板目录目录(默认是Tpl)下保存存为.htaccess。

  Order Allow,Deny  Deny from all 

如果你的模板文件后缀不是html可以将*.html改成你的模板文件的后缀。表单安全自动验证和自动完成ThinkPHP内置的自动验证和自动完成功能可以有效地对表单提交的数据安全加以控制。这两部分在快速入门系列中已经有过详细的介绍,就不再描述了。表单令牌

ThinkPHP内置了表单令牌验证功能,可以有效防止表单的重复提交等安全防护。表单令牌验证相关的配置参数有:

'TOKEN_ON'=>true,  // 是否开启令牌验证 默认关闭 'TOKEN_NAME'=>'__hash__',    // 令牌验证的表单隐藏字段名称 'TOKEN_TYPE'=>'md5',  //令牌哈希验证规则 默认为MD5 'TOKEN_RESET'=>true,  //令牌验证出错后是否重置令牌 默认为true

如果开启表单令牌验证功能,系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域,其值则是TOKEN_TYPE方式生成的哈希字符串,用于实现表单的自动令牌验证。自动生成的隐藏域位于表单Form结束标志之前,如果希望自己控制隐藏域的位置,可以手动在表单页面添加{__TOKEN__} 标识,系统会在输出模板的时候自动替换。如果页面中存在多个表单,建议添加{__TOKEN__}标识,并确保只有一个表单需要令牌验证。如果个别页面输出不希望进行表单令牌验证,可以在控制器中的输出方法之前动态关闭表单令牌验证,例如:

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

模型类在创建数据对象的同时会自动进行表单令牌验证操作,如果你没有使用create方法创建数据对象的话,则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回false,则表示表单令牌验证错误。例如:

$User = M("User"); // 实例化User对象 // 手动进行令牌验证 if (!$User->autoCheckToken($_POST)){ // 令牌验证错误 }表单合法性检测表单合法性检测是3.1版本开始增加的表单提交字段检测机制,你不再需要担心用户在提交表单的时候注入非法字段数据了。表单字段合法性检测需要使用create方法创建数据对象的时候才能生效,有两种方式:一、属性定义

可以给模型配置insertFields 和 updateFields属性用于新增和编辑表单设置,使用create方法创建数据对象的时候,不在定义范围内的属性将直接丢弃,避免表单提交非法数据。insertFields 和 updateFields属性的设置采用字符串(逗号分割多个字段)或者数组的方式,例如:

class UserModel extends Model{    protected $insertFields = array('account','password','nickname','email');    protected $updateFields = array('nickname','email'); }

设置的字段应该是实际的数据表字段,而不受字段映射的影响。在使用的时候,我们调用create方法的时候,会根据提交类型自动识别insertFields和updateFields属性:

D('User')->create();

使用create方法创建数据对象的时候,新增用户数据的时候,就会屏蔽'account','password','nickname','email' 之外的字段,编辑的时候就会屏蔽'nickname','email'之外的字段。下面是采用字符串定义的方式,同样有效:

class UserModel extends Model{    protected $insertFields = 'account,password,nickname,email';    protected $updateFields = 'nickname,email'; }二、方法调用如果不想定义insertFields和updateFields属性,或者希望可以动态调用,可以在调用create方法之前直接调用field方法,例如,实现和上面的例子同样的作用:在新增用户数据的时候,使用:二、方法调用

如果不想定义insertFields和updateFields属性,或者希望可以动态调用,可以在调用create方法之前直接调用field方法,例如,实现和上面的例子同样的作用:在新增用户数据的时候,使用:

$User = M('User'); $User->field('account,password,nickname,email')->create(); $User->add();

而在更新用户数据的时候,使用:

$User = M('User'); $User->field('nickname,email')->create(); $User->where($map)->save();

这里的字段也是实际的数据表字段。field方法也可以使用数组方式。如果你的字段比较多,还可以使用field方法的排除功能,例如:

$User->field('status,create_time',true)->create();变量安全变量安全获取对全局系统变量的获取建议采用系统提供的变量获取方法获取,具体可以参考快速入门系列的变量全局变量过滤

如果你习惯于直接调用$_GET $_POST变量的话,那么或者可以采用ThinkPHP系统内置的对全局变量的安全过滤方式,只需要设置VAR_FILTERS参数。例如:

'VAR_FILTERS'=>'HTMLspecialchars'

在3.1.2版本开始,安全过滤方法的定义函数需要调整为引用返回的方式,而且能够实现多维数组的递归过滤,例如:

'VAR_FILTERS'=>'filter_vars'

对应的过滤方法定义如下:

function filter_vars(&$value){    $value = htmlspecialchars($value); }

以上就是我为大家总结的有关php编程安全的问题,如需知道更多关于php编程安全的问题,请关注我们,我们会在一段时间内更新关于这方面的知识。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23701505/viewspace-1113556/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-04-11