第31天-WEB开发安全审计学习笔记:从原生PHP到ThinkPHP框架实战

admin 2026-03-03 09:14:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文是一份WEB开发安全审计学习笔记,涵盖原生PHP安全基础、模板引擎风险及ThinkPHP框架开发与安全实践。重点分析了SQL注入、弱类型比较、文件上传等常见漏洞成因,对比了框架规范写法与危险写法的区别。通过WeMall系统案例展示了实战审计思路,建议开发者严格遵循框架规范,使用参数绑定与输入过滤,并关注框架版本更新以修复已知漏洞。 综合评分: 85 文章分类: 代码审计,WEB安全,安全开发,实战经验


cover_image

第31天-WEB开发安全审计学习笔记:从原生PHP到ThinkPHP框架实战

原创

萧瑶 萧瑶

AlphaNet

2026年2月15日 12:41 韩国

安全无小事,代码审计是每一位Web开发者的必修课。本文将从原生PHP基础开始,带你深入理解ThinkPHP框架的开发技术、写法安全以及真实代码审计案例,助你构建更安全的Web应用。


一、原生PHP开发与安全基础

在进入框架之前,我们先回顾原生PHP中那些容易出安全问题的知识点。

  1. 超级全局变量

· $_GET / $_POST / $_REQUEST:直接使用用户输入可能导致SQL注入、XSS等。

· $_COOKIE / $_SESSION:会话管理不当可能导致会话固定、会话劫持。

· $_FILES:文件上传处理不当可能导致任意文件上传。

· $_SERVER:如HTTP_CLIENT_IP可被伪造,用于IP欺骗。

安全建议:对所有输入进行过滤和验证,使用htmlspecialchars防止XSS,使用预处理语句防止SQL注入。

  1. 代码审计案例:SQL注入
// 危险代码

$id = $\_GET['id'];

$sql = "SELECT \* FROM users WHERE id = $id";

$result = mysqli\_query($conn, $sql);

审计点:直接拼接参数,未使用参数化查询。

  1. 数据库通讯

· 使用mysqli或PDO扩展,推荐PDO + 预处理。

· 配置文件中的数据库密码不应硬编码在代码中,应使用环境变量。

  1. Cookie & Session & Token

机制 存储位置 特点 安全风险

Cookie 客户端 可持久化,大小受限 容易被窃取(需设置HttpOnly、Secure)

Session 服务端 安全,依赖Cookie存储Session ID Session固定、Session劫持

Token 客户端/服务端 无状态,适用于API Token泄露、签名算法弱点

代码审计案例:身份验证绕过

// 错误示例:仅依赖Cookie中的isAdmin

if ($\_COOKIE['isAdmin'] == '1') {

// 执行管理员操作

}

审计点:身份标识不应放在客户端可控位置,应使用Session或签名的Token。

  1. 弱类型与函数特性安全

PHP弱类型比较(== vs ===)可能导致绕过:

var\_dump('123a' == 123);  // true

var\_dump('admin' == 0);    // true

审计案例:登录验证中使用==比较密码哈希可能导致哈希碰撞绕过。

  1. 数据对比代码审计案例
if ($\_POST['password'] == $stored\_hash) {

// 登录成功

}

问题:==会先进行类型转换,可能绕过密码验证。应使用===或password_verify。


二、模板引擎与插件安全

  1. Smarty模板引擎

· 模板编译机制,将PHP代码嵌入模板需谨慎。

· 安全配置:禁用php函数、禁用静态类调用等。

  1. 模板插件代码审计案例

漏洞点:插件中直接使用eval或assert执行动态代码。

// 恶意模板:{eval var=$user\_input}

审计:检查模板中是否允许执行PHP代码,以及插件函数是否对输入进行了过滤。


三、ThinkPHP框架开发技术详解

ThinkPHP作为国内流行的PHP框架,其开发技术要点如下:

  1. 配置架构

· 入口文件:public/index.php,定义应用目录、加载基础文件。

· 数据库配置:config/database.php,包含数据库类型、主机、名称、账号密码。

· 调试开关:app_debug在开发环境开启,生产环境关闭,避免敏感信息泄露。

  1. 路由访问

· URL模式:支持普通模式、PATHINFO、兼容模式等。

· 文件目录对应:默认模块/控制器/操作,如index.php/index/user/login对应application/index/controller/User.php的login方法。

· 路由定义:可通过route.php自定义路由规则。

  1. 请求变量

· 请求对象:think\Request,通过依赖注入或助手函数request()获取。

· 变量获取:

$name = input('get.name');  // 助手函数

$name = Request::instance()->param('name');

· 提交方法:$request->method()判断请求类型。

  1. 数据库操作

· 引用DB类:use think\Db;(TP5)或use think\facade\Db;(TP6)。

· 基本查询:

$user = Db::table('user')->where('id', 1)->find();

· 助手函数:db(‘user’)->where(‘id’, 1)->find();

· 注意:使用fetchSql调试SQL,避免SQL注入(框架已做参数绑定,但需注意原生查询)。

  1. 前端页面渲染-MVC模型

· 引擎配置:默认使用PHP原生模板,也可配置为Smarty等。

· 渲染变量:

$this->assign('name', 'ThinkPHP');

return $this->fetch('index');

· 模板输出:{$name},支持函数、运算符。


四、ThinkPHP框架写法安全

框架本身提供了许多安全机制,但开发者的写法不当仍会导致漏洞。

  1. 自写代码逻辑的安全问题

例子1:不合规的代码写法

public function search()

{

$keyword = input('get.keyword');

$data = Db::query("SELECT \* FROM article WHERE title LIKE '%$keyword%'");

// 直接拼接SQL,绕过框架参数绑定

}

审计点:应使用框架的查询构造器或参数绑定。

例子2:一半框架一半自写代码

public function delete()

{

$id = input('post.id');

if (!is\_numeric($id)) {

return 'ID非法';

}

Db::execute("DELETE FROM user WHERE id = " . $id);

}

问题:虽然检查了数字,但可能存在整形溢出或逻辑漏洞,且未使用参数绑定。

例子3:框架标准内置代码写法(安全)

public function delete()

{

$id = input('post.id/d'); // 强制转换为整数

Db::name('user')->where('id', $id)->delete();

}
  1. 框架版本安全

参考:ThinkPHP-Vuln

例子1:TP5 SQL注入(写法内置安全绕过)

在TP5中,某些查询方式可能导致SQL注入,例如:

// 危险写法

Db::table('user')->where('id', 'exp', $\_GET['id'])->select();

攻击者可传入id=1 and 1=1等,由于使用了exp表达式,框架不会进行参数绑定。

例子2:TP5 代码执行漏洞(CVE-2018-20062)

由于框架对控制器名过滤不严,导致可调用任意方法,甚至远程代码执行。需及时更新补丁或升级版本。


五、ThinkPHP代码审计案例:WeMall

WeMall是一款基于ThinkPHP5开发的开源商城系统,其代码审计常见漏洞点包括:

  1. SQL注入

· 搜索功能:直接拼接input参数到where条件中,未使用参数绑定。

· 排序字段:order参数未过滤,可能导致报错注入。

  1. 文件上传

· 头像上传:仅验证文件后缀,未验证MIME类型或内容,可上传PHP文件。

· 编辑器上传:未限制文件类型,导致任意文件上传。

  1. 越权操作

· 订单操作:未校验用户ID,导致可以修改他人订单。

· 后台管理:未严格验证管理员权限,普通用户可直接访问后台控制器。

  1. 模板注入

· 使用了模板继承,但未对用户可控制的变量进行过滤,可能造成模板注入(若使用eval)。

审计思路:

· 全局搜索Db::query、Db::execute等原生查询方法。

· 搜索input获取的参数,追踪其使用路径。

· 检查上传功能点,查看文件保存逻辑。

· 查看权限验证中间件或基类控制器的_initialize方法。


📌 总结

  1. 原生PHP是基础,理解超级全局变量、弱类型、Session机制对代码审计至关重要。

  2. 框架安全不仅取决于框架本身,更取决于开发者的使用方式。遵循框架规范,使用参数绑定、输入过滤、权限验证是基本要求。

  3. 代码审计需要结合业务逻辑,关注输入点、敏感函数、配置文件等。工具扫描辅助,人工审计为主。

  4. 持续学习:关注框架更新和漏洞公告,参考开源审计案例提升实战能力。

安全开发,始于规范,成于审计。希望这份笔记能帮助你在WEB开发与安全审计的道路上走得更远!


参考资料:

· ThinkPHP官方手册:https://www.kancloud.cn/manual/thinkphp5

· ThinkPHP漏洞集合:https://github.com/Mochazz/ThinkPHP-Vuln


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AlphaNet 萧瑶 萧瑶《第31天-WEB开发安全审计学习笔记:从原生PHP到ThinkPHP框架实战》

评论:0   参与:  0