ThinkPHP七周年了

ThinkPHP七周年了

  • 七年来,ThinkPHP专注于WEB应用快速开发。
  • 七年来,ThinkPHP超过了300W次下载。
  • 七年来,ThinkPHP经历了7个里程碑版本。
  • 七年来,ThinkPHP为50W个网站提供了底层框架。

认识ThinkPHP在09年,伴我走过了4年,结下了不解情缘。
回顾一下:

  • 09年,开始使用ThinkPHP,从此爱上了它,还是1.5版本;
  • 10年,与ThinkPHP创始人流年有所接触,参与ThinkPHP部分功能测试;
  • 12年,正式加入ThinkPHP核心团队,参与ThinkPHP3.0版本的架构与测试;

未来的日子,与ThinkPHP共同成长!

ThinkPHP framework 任意代码执行漏洞预警

ThinkPHP是一个国内使用很广泛的老牌PHP MVC框架。貌似国内有不少创业公司或者项目都用了这个框架。

最近官方发布了一个安全补丁,官方表述是:该URL安全漏洞会造成用户在客户端伪造URL,执行非法代码。

可是貌似大多数开发者和使用者并没有注意到此漏洞的危害性,应者了了,更不用说有多少人去升级了。随后我对其进行了分析,发现此问题果然是一个非常严重的问题,只要使用了thinkphp框架,就可以直接执行任意php代码。特此发帖预警各位。 继续阅读ThinkPHP framework 任意代码执行漏洞预警

ThinkPHP3.0.1dev发布

注意,这次发布的是开发版本,提供开发人员体验和测试,不建议用于正式项目。

[ 更新日志 ]
Action参数绑定支持
模型类命名范围支持
全局系统变量安全过滤支持
增加IS_GET IS_POST IS_PUT 等请求类型常量
日志记录改进 优化日志大小 增加IP记录
U函数对子域名部署的增强和优化
模型类增加filter连贯操作方法 用于对数据的安全过滤
模型类的data方法支持获取当前数据对象
Action类增加_param方法支持 可以自动根据当前提交类型 获取参数
Action类的_get _post方法支持多函数过滤
改进ajaxReturn方法
改进success和error方法
增加自动验证的规则
分组模式下 模型分组可以自动加载
模型类增加close方法 驱动类支持多数据库连接关闭
模型类增加表单提交字段合法性检测 配置insert_fields 和 update_fields
模型强制进行数据字段类型验证
增加DB_SLAVE_NO配置参数 用于指定读服务器的序号
优化模型的create方法的数据对象生成
自动验证的function和callback规则支持多字段

下载地址:http://thinkphp.cn/down-176.html

SQL预处理语句(Prepared Statements)

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:

查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。

传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(然而,如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)。 继续阅读SQL预处理语句(Prepared Statements)

让ThinkPHP支持多伪静态后序

需求场景
大家都听说过伪静态有利于SEO,很自然的想到ThinkPHP的URL伪静态功能,当然这只是一个引子。
真正蛋疼的需求来了,当你要为自已的站点增加一个网站地图链接的时候,如:

http://www.a.com/index.php/Sitemap/index

通过隐藏index.php之后URL变成了这样

http://www.a.com/Sitemap/index

因为ThinkPHP支持默认操作,URL再简化一点

http://www.a.com/Sitemap

加上伪静态

http://www.com/Sitemap.html

继续阅读让ThinkPHP支持多伪静态后序

wnmpserver+ThinkPHP3.0性能测试

声明:此报告纯粹无聊,并不是为了证明wnmpserver的性能多优越,也不是证明ThinkPHP的性能有多好,ThinkPHP性能测试参考《3.0调试模式和部署模式的性能比较》。

Hello World测试

部署模式
Requests per second: 91.25 [#/sec] (mean)
Time per request: 1095.863 [ms] (mean)
Time per request: 10.959 [ms] (mean, across all concurrent requests)
Transfer rate: 52.22 [Kbytes/sec] received

调试模式
Requests per second: 74.04 [#/sec] (mean)
Time per request: 1350.577 [ms] (mean)
Time per request: 13.506 [ms] (mean, across all concurrent requests)
Transfer rate: 40.26 [Kbytes/sec] received

ThinkPHP中数据操作心得

模板中使用函数,相信大部分的TPer都知道也用过吧。
案例:
获取用户名的方法

function get_username($uid){
    $row = M('User')->getbyUid($uid);
    return $row['username'];
}

在模板中通过uid显示用户名

<volist name="rows" id="row">
<tr>
    <td>{$row.uid}</td>
    <td>{$row.uid|get_username}</td>
</tr>
</volist>

这种方法相信大伙应该很常用吧?这种用法有两个不好的地方:
1、过多数据库操作;
2、数据操作的位置不合理,数据库连接过长。

优化方案:
1、尽可能把能合并的数据库操作;
2、数据操作应该保留在数据层,尽可能避免在视图里操作数据库,建议在视图开始前执行mysql_close(),断开数据库连接。

ThinkPHP 3.0RC2 更新日志

ThinkPHP 3.0RC2 ChangeLog

[系统]
[修正] 修正R方法的第二个参数传人数组
[修正] 修正部署模式下的模版编译问题。
[新增] 添加项目的core.php配置文件,用于追加项目核心编译列表文件
[新增] 添加layout方法 用于控制布局入口的文件
[新增] functions函数库添加trace函数,用于页面Trace信息设置和自定义添加显示 并调整页面Trace行为扩展和模板,改为调用trace方法
[改进] 优化alias_import方法
[改进] 改进import的项目类库目录判断
[改进] Think类的buildApp方法改进 模式别名定义和项目别名定义支持同时定义 取消模式的公共文件定义,直接在核心文件列表中加载即可
[改进] 系统函数库增加session函数用于操作session App类改进对session的支持
[改进] 改进View类,如果设置模板引擎为PHP的话 则不调用view_parse标签行为扩展
[改进] 项目自定义trace信息配置文件会合并到系统默认页面Trace中
[改进] LOG类完善 支持配置不同的日子记录方式和其他参数 惯例配置文件增加LOG_TYPE、LOG_DEST和LOG_EXTRA配置 LOG_RECORD_LEVEL 参数更名为LOG_LEVEL
[改进] 优化import方法的文件导入 如果存在类名冲突则不导入
[改进] 改进系统函数库的load方法
[改进] runtime和alias文件添加访问检测
[改进] 修正部署模式下面开启页面trace后 exec运行时间为负数的错误
[改进] 修正Widget类对于think引擎的判断
[改进] 系统路径常量允许被重定义
[删除] 去掉runtime文件中的mkdirs函数
继续阅读ThinkPHP 3.0RC2 更新日志

ThinkPHP防范XSS跨站攻击

一直使用ThinkPHP,通过乌云有向提交了ThinkPHP XSS攻击的bug,抽时间看了一下。
原理是通过URL传入script标签,ThinkPHP异常错误页面直接输出了script。

原理:

http://ask.lenovo.com.cn/index.php?s=1%3Cbody+onload=alert(1)%3E

其中m的值是一个不存在的module,同时是一个完全的script,在异常错误页面中被执行实现XSS跨站攻击。

防范方法
找到异常错误页面模板ThinkException.tpl.php(2,x),think_exception.tpl(3.x)有两个地方要修改:

第57行 echo($_SERVER[‘PHP_SELF’])
改为 echo strip_tags($_SERVER[‘PHP_SELF’])
第62行 echo $e[‘message’]
改为 echo strip_tags($e[‘message’])

另外,马上要发布的3.0官方已经对TP变量GROUP_NAME,MODULE_NAME,ACTION_NAME,__URL__,__SELF__,__APP__,$_SERVER[‘PHP_SELF’]做了安全处理。

PS:安全不是框架的责任,大家在开发的时候须自己注意。