thinkphp的安全性安全性和可扩展性怎样体现

ThinkPHP函数详解:I方法 - ThinkPHP框架
ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用。概述正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'])
变量类型是指请求方式或者输入类型,包括:
变量类型含义
get获取GET参数
post获取POST参数
param自动判断请求类型获取GET、POST或者PUT参数
request获取REQUEST 参数
put获取PUT 参数
session获取 $_SESSION 参数
cookie获取 $_COOKIE 参数
server获取 $_SERVER 参数
globals获取 $GLOBALS参数注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
用法我们以GET变量类型为例,说明下I方法的使用:echo&I('get.id');&//&相当于&$_GET['id']
echo&I('get.name');&//&相当于&$_GET['name']支持默认值:echo&I('get.id',0);&//&如果不存在$_GET['id']&则返回0
echo&I('get.name','');&//&如果不存在$_GET['name']&则返回空字符串采用方法过滤:echo&I('get.name','','htmlspecialchars');&//&采用htmlspecialchars方法对$_GET['name']&进行过滤,如果不存在则返回空字符串支持直接获取整个变量类型,例如:I('get.');&//&获取整个$_GET&数组用同样的方式,我们可以获取post或者其他输入类型的变量,例如:I('post.name','','htmlspecialchars');&//&采用htmlspecialchars方法对$_POST['name']&进行过滤,如果不存在则返回空字符串
I('session.user_id',0);&//&获取$_SESSION['user_id']&如果不存在则默认为0
I('cookie.');&//&获取整个&$_COOKIE&数组
I('server.REQUEST_METHOD');&//&获取&$_SERVER['REQUEST_METHOD']&param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:echo&I('param.id');&如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。
并且param类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:
当前访问URL地址是 http://serverName/index.php/New/&那么我们可以通过echo&I('param.1');&//&输出2013
echo&I('param.2');&//&输出06
echo&I('param.3');&//&输出01事实上,param变量类型的写法可以简化为:I('id');&//&等同于&I('param.id')
I('name');&//&等同于&I('param.name')变量过滤使用I方法的时候 变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数,这里一定要注意,3.1版本之后,VAR_FILTERS参数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置htmlspecialchars是无效的,你可以自定义一个方法,例如:function&filter_default(&$value){
&&&&$value&=&htmlspecialchars($value);
}然后配置:'VAR_FILTERS'=&'filter_default'如果需要进行多次过滤,可以用:'VAR_FILTERS'=&'filter_default,filter_exp'filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。
因为VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤,事实上,该参数的默认设置是:'DEFAULT_FILTER'&&&&&&&&=&&'htmlspecialchars'也就说,I方法的所有获取变量都会进行htmlspecialchars过滤,那么:I('get.name');&//&等同于&htmlspecialchars($_GET['name'])同样,该参数也可以支持多个过滤,例如:'DEFAULT_FILTER'&&&&&&&&=&&'strip_tags,htmlspecialchars'I('get.name');&//&等同于&htmlspecialchars(strip_tags($_GET['name']))如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:echo&I('get.name','','strip_tags');&//&等同于&strip_tags($_GET['name'])I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:I('post.email','',FILTER_VALIDATE_EMAIL);表示 会对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。
(关于更多的验证格式,可以参考 。)
或者可以用下面的字符标识方式:I('post.email','','email');可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:int
validate_regexp
validate_url
validate_email
validate_ip
special_chars
unsafe_raw
number_int
number_float
magic_quotes
callback在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:I('get.name','',NULL);一旦过滤参数设置为NULL,即表示不再进行任何的过滤。
积分:29922
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。本文以实例的形式详细介绍了ThinkPHP的行为扩展Behavior的实现方法,有助于读者更灵活的掌握ThinkPHP的开发,具体步骤如下:
ThinkPHP 行为扩展 (Behavior) 流程:
最先是读取配置文件信息:
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
读取配置文件信息 ThinkPHP\Mode\common.php
// 行为扩展定义
'tags' =& array(
'app_init'
'app_begin'
'Behavior\ReadHtmlCache', // 读取静态缓存
'Behavior\ShowPageTrace', // 页面Trace显示
'path_info'
=& array(),
'action_begin' =& array(),
'action_end'
=& array(),
'view_begin'
=& array(),
'view_parse'
'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
'template_filter'=& array(
'Behavior\ContentReplace', // 模板输出替换
'view_filter'
'Behavior\WriteHtmlCache', // 写入静态缓存
'view_end'
=& array(),
默认调用了系统行为扩展:静态缓存读取 、页面Trace显示输出、模板解析、模板内容输出替换、静态缓存写入
// 加载模式行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
分别用Hook去加载 系统行为和自定义行为,并把配置信息保存到 Hook 私有属性$tags中
ThinkPHP\Library\Think\Think.class.php 初始化完成后会调用App::run();
ThinkPHP\Library\Think\App.class.php文件如下:
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
static public function run() {
// 应用初始化标签
Hook::listen('app_init');
App::init();
// 应用开始标签
Hook::listen('app_begin');
// Session初始化
if(!IS_CLI){
session(C('SESSION_OPTIONS'));
// 记录应用初始化时间
G('initTime');
App::exec();
// 应用结束标签
Hook::listen('app_end');
可以看出程序在App init之前 通过钩子去监听(查看)此动作时是否有需要处理的。循环$tags['app_init']获取类名并通过类名自动执行行为扩展类run方法
所有钩子如下:
'url_dispatch'
// URL调度结束标签
'app_init'
// 应用初始化标签
'app_begin'
// 应用开始标签
// 应用结束标签
'action_begin'
// 动作执行前操作
'action_end'
// 动作执行后操作
'ajax_return'
// 用于扩展其他返回格式数据
'path_info'
// 检测路由规则 如果没有则按默认规则调度URL
'template_filter'
// 模版编译过滤标签
'view_begin'
// 视图开始标签
'view_end'
// 视图结束标签
'view_parse'
// 视图解析标签
'view_filter'
// 内容过滤标签
缺点如下:
1.顺序不可控(配置文件没有专门的参数去控制顺序)如app_init同时有2个监控时先调用哪个方法。
2.监控不是全局监控内部写的太死只有一些定义好的不能通过配置文件去自动控制每一个操作的钩子(可能是考虑到性能才没有加)
优点如下:
1.可以实现了好多行为扩展
2.可以代理检测、浏览器防刷新检测、操作路由检测等
行为扩展就是在 程序某个操作时去额外的去执行某一特定功能。如程序在操作数据库 读的时候 通过explian获取性能信息并监测性能瓶颈 如出现获取数据时超过特定秒数 就把相关信息email给项目经理等。
ThinkPHP的应用模式使得开发人员对核心框架进行改造较以往更为得心应手,并且可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对于ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli、Lite、Thin、AMF、PHPRPC、REST模式,其定义方式和ThinkPHP3.2版本的方式大同小
ThinkPHP的Widget扩展用于根据页面需要输出不同内容,它在项目目录中的Lib/Widget下定义。 具体定义如下:
class NewsListWidget extends Widget{ public function render($data){ // code... } }
需要注意: 1.Widget是一个抽象类,其中有一个抽象方法(abstract)render,必须在
WCF以其灵活的可扩展架构为开发者提供了方便,其中对行为的扩展或许是应用中最为常见的。自 定义对行为的扩展并不复杂,但仍有许多细节需要注意。在服务端,一般是对DispatchRuntime和DispatchOperation进行扩展, 扩展点包括了对参数和消息的检查,以及操作调用程序,它们对应的接口分别为 IParameterInspector,IDispatchMessageInspector以
为了让读者对如何利用相应的行为对WCF进行扩展有个深刻的认识,在这里我提供一个简单的实例演示。本实例模拟的场景是这样的:我们创建一个支持多语言的资源服务,该服务旨在为调用者提供基于某种语言的文本型资源。但是,我们不希望客户端在每次调用服务的时候都显式地制定具体的语言,而是根据客户端服务调用线程表示语言文化的上下文来自动识别所需的语言。[源代码从这里下载] 要让资源服务具有识别语言文化的能够,我们必
本文以实例代码的形式深入剖析了ThinkPHP权限认证Auth的实现原理与方法,具体步骤如下: mysql数据库部分sql代码:
-- ---------------------------- -- Table structure for think_auth_group -- ---------------------------- DROP TABLE IF EXISTS `think_a
import方法是ThinkPHP框架用于类库导入的封装实现,尤其对于项目类库、扩展类库和第三方类库的导入支持,import方法早期的版本可以和java的import方法一样导入目录和通配符导入,后来考虑到性能问题,在后续的版本更新中不断改进和简化了,所以现在的用法比较简单明了。调用格式: import('类库名', '起始路径', '类库后缀') imprt方法有一个别名vendor方法,专门用
M方法用于实例化一个基础模型类,和D方法的区别在于: 1、不需要自定义模型类,减少IO加载,性能较好; 2、实例化后只能调用基础模型类(默认是Model类)中的方法; 3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息; D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。 M方法的调用格式: M('[
ThinkPHP的N方法属于计数器方法,被用于核心的查询、缓存统计的计数和统计。但是其实可以用于应用的其他计数用途,用法比较简单,调用格式: N('计数位置'[,'步进值']) 例如,我们要统计页面中的查询次数,可以用
N('read',1);
表示每次执行到该位置都会引起计数器加1,到页面结束之前,我们就可以用
$count = N('read');
来统计当前页面执行的查询数目
ThinkPHP的R方法用于调用某个控制器的操作方法,是A方法的进一步增强和补充。 R方法的调用格式: R('[项目://][分组/]模块/操作','参数','控制器层名称')
例如,我们定义了一个操作方法为:
class UserAction extends Action { public function detail($id){ return M('User')-&find($
D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下: D('[项目://][分组/]模型','模型层名称') 方法的返回值是实例化的模型对象。 D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复
Windows & Communication Foundation (WCF) 提供了许多扩展点,供开发人员自定义运行时行为,从而实现服务调度和客户代理调用。您可以通过编写能以声明方式应用到服务中的自定义行为来使用这些扩展点。本月将为您介绍这一流程的工作原理。
WCF 可扩展性
在上期专栏中,我重点介绍了 WCF 绑定概念,您可以为 WCF 服务上的各个终结点指定绑
【Android病毒分析报告】 - AppPortal “恶意行为云端无限扩展”
本文章由Jack_Jia编写,转载请注明出处。文章链接:http://blog.csdn.net/jiazhijun/article/details/ 作者:Jack_Jia 邮箱:[emailprotected]
本文讲述了ThinkPHP模板替换与系统常量及应用,是ThinkPHP项目开发的基础知识,有必要加以牢固掌握。具体如下: 默认的模板替换规则: ../Public : 会被替换成当前项目的公共模板目录 通常是 / 项目目录 /Tpl/default/Public/ __PUBLIC__ :会被替换成当前网站的公共目录 通常是 /Public/ __TMPL__ : 会替换成项目的模板目录 通常是
ThinkPHP是目前国内应用非常广泛的一款MVC开发框架。本文就以实例形式解析ThinkPHP的MVC开发机制。相信会给大家一定的启发作用。具体分析如下: 一、概述: MVC框架解析如下: M Model层 模型:就是数据库操作类(通过数据库操作类去操作各个表)
getField方法是ThinkPHP中用来获取字段值的方法,区别于select和find方法,通常仅用于获取个别字段的值。但是事实上并没有那么简单,现将该方法的用法总结如下: 1.获取某个字段值 这个是getField方法最基本的用法,用于获取符合条件的某个字段值。
$User = M(&User&); // 实例化User对象 // 获取ID为3的用户的昵称 $nick
ThinkPHP提供的视图查询应用功能十分强大,用户利用视图查询功能可以将多个数据表的字段内容按需要进行指定和筛选,组织成一个基于这些数据表的视图模型,然后就可以通过该模型直接进行多表联合查询,非常方便和简单。 例如在项目中,我们定义有三个表: user 用户基础表, user_info&n
本文实例讲述了ThinkPHP分页的实现方法,分享给大家供大家参考。具体方法如下: 在TP3.2框架手册中有一个数据分页,不过每次都要写太多的代码,还有中文设置等有些麻烦,做为程序开发者,有必要整理下: 实例运行效果如下图所示:
一、分页方法:
* TODO 基础分页的相同代码封装,使前台的代码更少
* @param $m 模型,引用传递
本文实例讲述了ThinkPHP基本的增删查改操作,是ThinkPHP项目开发中最常用的基础操作,有着十分重要的应用价值。现将完整的实例代码与大家分享,希望能对大家有所帮助。具体如下: 一、表aoli_user字段设置: 表aoli_user主要有以下几个字段: id username password create
ThinkPHP的系统内置有一个惯例配置文件(位于系统目录下面的Conf\convention.php),按照大多数的使用对常用参数进行了默认配置。本文对惯例配置文件作出注释详解如下,供大家参考:
&?php /** +------------------------------------------------------------------------------ * Thin
在坏的设计中,数据往往是分散的,甚至是杂乱的,这就好像一群失去意识的猛兽,我们无法控制、协调以及管理它们。这种漫无头绪的散乱数据,犹如猛兽的肆意妄为,会给系统带来无尽的灾难。随着系统的演化,这种灾难会逐渐蔓延至系统的各个角落。因此,在面向对象设计过程中,对数据分类是识别对象的一个前提。但是,仅仅封装了数据的对象,如果没有操作数据的行为,仍旧是没有意识的死亡对象。 我始终认为,对象在拥有自己数据的情
WCF服务端运行时框架的构建
WCF服务端运行时架构体系详解[上篇] WCF服务端运行时架构体系详解[中篇] WCF服务端运行时架构体系详解[下篇] WCF服务端运行时架构体系详解[续篇]
WCF客户端运行框架的构建
WCF客户端运行时架构体系详解[上篇] WCF客户端运行时架构体系详解[下篇]
通过“四大行为”对WCF的扩展[原理篇] 通过“四大行为”对WCF的扩展[实例篇
ThinkPHP模板的present标签用于判断模板变量是否已经赋值。 ThinkPHP模板引擎的present标签用来判断模板变量是否已经赋值,其功能相当于PHP中的isset()函数行为,格式如下:
&present name=&变量名&&要输出的内容&/present&
用法举例如下:
&present name=&use
本文实例讲述了thinkphp实现like模糊查询的方法,分享给大家供大家参考。具体实现方法如下: 目前使用thinkphp框架进行项目开发的人越来越多了,由于其封装性较好,导致了很多纯PHP开发的部分不易上手,本文实例即以like模糊查询为例对此加以说明。 这里主要通过举例来说明用法: ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用索引数组或者对象来作为查询条件,因为
可以在官网的 /extend/223.html下载IP定位扩展类库,或者下载扩展包( /down/253.html)里面也已经包含该扩展类了。如果是单独下载的上传类库,把解压后的IpLocation.class.php 放入ThinkPHP/Extend/Library/ORG/Net/(如果没有请手动创建)目
本文讲述了ThinkPHP实例化模型的四种方法,对于ThinkPHP程序设计来说有非常重要的应用。具体如下: 1、创建一个基础模型:实例化一个系统自带的数据库操作类
Test.Model.class.php页面代码如下:
class TestModel extends Model{ }
UserAction.class.php页面代码如下
ThinkPHP的A方法用于在内部实例化控制器,其调用格式为: A('[项目://][分组/]模块','控制器层名称') 最简单的用法:
$User = A('User');
表示实例化当前项目的UserAction控制器(这个控制器对应的文件位于Lib/Action/UserAction.class.php),如果采用了分组模式,并且要实例化另外一个Admin分组的控制器可以用:
ThinkPHP模板的empty标签用于判断模板变量是否为空值。 ThinkPHP模板empty标签用来判断模板变量是否为空值,其功能相当于PHP中的empty()函数行为。empty标签使用格式如下:
&empty name=&变量名&&要输出的内容&/empty&
具体用法如下例所示:
&empty name=&userna
本文实例讲述了关于thinkphp中html:list标签传多个参数问题解决办法,分享给大家供大家参考。具体分析如下: 此改动 针对thinkphp 2.0 版本有效,thinkphp 3.0 版本 未测试. 主要修改这个文件 /Thinkphp/Lib/Think/Template/Taglib/TabLibHtml.class.php 的 _list 方法 注释有新增内容的代码部分是新增加的
本文实例讲述了ThinkPHP中使用ajax的方法,提交表单如下图所示:
点击提交,不需要刷新本页,将内容提交到数据库当中,并在本页显示提交的内容。如下图所示:
一、jquery实现方法: MessageAction.class.php页面代码如下:
&?php class MessageAction extends Action{ function index(){ $this-&
文件上传是很多PHP程序项目中常见的一个功能,今天本文就来分享一个完整的实例,来实现ThinkPHP文件上传的功能。具体方法如下: 一、action部分: FileAction.class.php页面代码如下:
&?php class FileAction extends Action{ function index(){ $file=M('file'); $list=$file-&gt
本文实例讲述了ThinkPHP表单自动验证的实现方法。分享给大家供大家参考。具体方法如下: 该示例代码采用TP 3.2框架实现。具体代码如下:
public function add_post(){
//验证规则
本文实例讲述了ThinkPHP模板中数组循环的实现方法。分享给大家供大家参考。具体实现方法如下: ThinkPHP开发过程中经常用到输出数组在模板中使用,一般select出来的数据都是二维数组,我们在模板中用volist标签就可以输出,今天开发遇到了这样一个问题:如果是二维数组,如何在模板中输出呢?经过查看开发手册,问题得到解决,分享一下,比如这样的一维数组:
本文实例讲述了ThinkPHP常用的两个功能:验证码与分页。在ThinkPHP的项目开发中非常常见,具有很高的实用价值。完整实例分享给大家,供大家参考。具体如下: 一、验证码: 导入验证码类,在aoli\ThinkPHP\Lib\ORG\Util\Image.class.php里有验证码方法 1.英文验证码:
buildImageVerify($length
ThinkPHP内置了表单令牌验证功能,可以有效防止表单的远程提交等安全防护。 表单令牌验证相关的配置参数有:
'TOKEN_ON'=&true, // 是否开启令牌验证 'TOKEN_NAME'=&'__hash__', // 令牌验证的表单隐藏字段名称 'TOKEN_TYPE'=&'md5', //令牌哈希验证规则 默认为MD5
如果开启表单令牌验证功能,系统会自动在
本文实例讲述了ThinkPHP在新浪SAE平台的部署方法。分享给大家供大家参考。具体实现方法如下: ThinkPHP自从thinkphp3.0版本开始提供了SAE平台支持,并具备众多特性,支持本地化开发和调试以及部署切换,让thinkphper轻松过渡到SAE开发。 一、准备工作: 1、您需要具备SAE的账号,如果您没有该账号,请到 SAE官方网站申请。 2、自己开发或者找一个基于thinkphp
一、首先需要在MsgManage控制器中加入分页方法知识点:1、count函数的试用2、Page类实例化操作及相关参数了解3、limit函数了用4、show函数了解 编辑文件admin/Lib/Action/MsgManageAction.class.php 代码如下:
class MsgManageAction extends CommonAction { &nb
本文实例讲述了ThinkPHP分组下自定义标签库的实现方法。分享给大家供大家参考。具体如下: 自定义标签库应该位于ThinkPHP\\Extend\\Driver\\TagLib目录下 1 新建标签类库文件名为TagLibBlog.class.php。 2 编辑刚才新建的类库文件,新建一个类,继承TagLib父类
import('TagLib');
class TagLib
ThinkPHP CURD操作的查询方法中最常用但也是最复杂的就是where方法。where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置。 where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM(对象关系映射)的重要组成部分和亮点所在,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持字符串和数组,
ThinkPHP模板引擎提供了丰富的比较标签,其用法格式为:
&比较标签 name=&变量& value=&值&&内容&/比较标签&
ThinkPHP系统支持的比较标签及其所表示的含义分别是: eq或者 equal:等于 neq 或者notequal:不等于 gt:大于 egt:大于等于 lt:小于 elt:小于等于 heq:恒
ThinkPHP CURD方法的limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。并且ThinkPHP的limit方法可以兼容所有的数据库驱动类。 其具体用法如下: 1.限制结果数量: 例如获取满足要求的10个用户,如下调用即可:
$User = M('User'); $User-&where('status=1')-&fiel}

我要回帖

更多关于 thinkphp安全性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信