文章总结: 本文是一份WEB开发安全审计学习笔记,涵盖原生PHP安全基础、模板引擎风险及ThinkPHP框架开发与安全实践。重点分析了SQL注入、弱类型比较、文件上传等常见漏洞成因,对比了框架规范写法与危险写法的区别。通过WeMall系统案例展示了实战审计思路,建议开发者严格遵循框架规范,使用参数绑定与输入过滤,并关注框架版本更新以修复已知漏洞。 综合评分: 85 文章分类: 代码审计,WEB安全,安全开发,实战经验
第31天-WEB开发安全审计学习笔记:从原生PHP到ThinkPHP框架实战
原创
萧瑶 萧瑶
AlphaNet
2026年2月15日 12:41 韩国
安全无小事,代码审计是每一位Web开发者的必修课。本文将从原生PHP基础开始,带你深入理解ThinkPHP框架的开发技术、写法安全以及真实代码审计案例,助你构建更安全的Web应用。
一、原生PHP开发与安全基础
在进入框架之前,我们先回顾原生PHP中那些容易出安全问题的知识点。
- 超级全局变量
· $_GET / $_POST / $_REQUEST:直接使用用户输入可能导致SQL注入、XSS等。
· $_COOKIE / $_SESSION:会话管理不当可能导致会话固定、会话劫持。
· $_FILES:文件上传处理不当可能导致任意文件上传。
· $_SERVER:如HTTP_CLIENT_IP可被伪造,用于IP欺骗。
安全建议:对所有输入进行过滤和验证,使用htmlspecialchars防止XSS,使用预处理语句防止SQL注入。
- 代码审计案例:SQL注入
// 危险代码
$id = $\_GET['id'];
$sql = "SELECT \* FROM users WHERE id = $id";
$result = mysqli\_query($conn, $sql);
审计点:直接拼接参数,未使用参数化查询。
- 数据库通讯
· 使用mysqli或PDO扩展,推荐PDO + 预处理。
· 配置文件中的数据库密码不应硬编码在代码中,应使用环境变量。
- Cookie & Session & Token
机制 存储位置 特点 安全风险
Cookie 客户端 可持久化,大小受限 容易被窃取(需设置HttpOnly、Secure)
Session 服务端 安全,依赖Cookie存储Session ID Session固定、Session劫持
Token 客户端/服务端 无状态,适用于API Token泄露、签名算法弱点
代码审计案例:身份验证绕过
// 错误示例:仅依赖Cookie中的isAdmin
if ($\_COOKIE['isAdmin'] == '1') {
// 执行管理员操作
}
审计点:身份标识不应放在客户端可控位置,应使用Session或签名的Token。
- 弱类型与函数特性安全
PHP弱类型比较(== vs ===)可能导致绕过:
var\_dump('123a' == 123); // true
var\_dump('admin' == 0); // true
审计案例:登录验证中使用==比较密码哈希可能导致哈希碰撞绕过。
- 数据对比代码审计案例
if ($\_POST['password'] == $stored\_hash) {
// 登录成功
}
问题:==会先进行类型转换,可能绕过密码验证。应使用===或password_verify。
二、模板引擎与插件安全
- Smarty模板引擎
· 模板编译机制,将PHP代码嵌入模板需谨慎。
· 安全配置:禁用php函数、禁用静态类调用等。
- 模板插件代码审计案例
漏洞点:插件中直接使用eval或assert执行动态代码。
// 恶意模板:{eval var=$user\_input}
审计:检查模板中是否允许执行PHP代码,以及插件函数是否对输入进行了过滤。
三、ThinkPHP框架开发技术详解
ThinkPHP作为国内流行的PHP框架,其开发技术要点如下:
- 配置架构
· 入口文件:public/index.php,定义应用目录、加载基础文件。
· 数据库配置:config/database.php,包含数据库类型、主机、名称、账号密码。
· 调试开关:app_debug在开发环境开启,生产环境关闭,避免敏感信息泄露。
- 路由访问
· URL模式:支持普通模式、PATHINFO、兼容模式等。
· 文件目录对应:默认模块/控制器/操作,如index.php/index/user/login对应application/index/controller/User.php的login方法。
· 路由定义:可通过route.php自定义路由规则。
- 请求变量
· 请求对象:think\Request,通过依赖注入或助手函数request()获取。
· 变量获取:
$name = input('get.name'); // 助手函数
$name = Request::instance()->param('name');
· 提交方法:$request->method()判断请求类型。
- 数据库操作
· 引用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注入(框架已做参数绑定,但需注意原生查询)。
- 前端页面渲染-MVC模型
· 引擎配置:默认使用PHP原生模板,也可配置为Smarty等。
· 渲染变量:
$this->assign('name', 'ThinkPHP');
return $this->fetch('index');
· 模板输出:{$name},支持函数、运算符。
四、ThinkPHP框架写法安全
框架本身提供了许多安全机制,但开发者的写法不当仍会导致漏洞。
- 自写代码逻辑的安全问题
例子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();
}
- 框架版本安全
参考: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开发的开源商城系统,其代码审计常见漏洞点包括:
- SQL注入
· 搜索功能:直接拼接input参数到where条件中,未使用参数绑定。
· 排序字段:order参数未过滤,可能导致报错注入。
- 文件上传
· 头像上传:仅验证文件后缀,未验证MIME类型或内容,可上传PHP文件。
· 编辑器上传:未限制文件类型,导致任意文件上传。
- 越权操作
· 订单操作:未校验用户ID,导致可以修改他人订单。
· 后台管理:未严格验证管理员权限,普通用户可直接访问后台控制器。
- 模板注入
· 使用了模板继承,但未对用户可控制的变量进行过滤,可能造成模板注入(若使用eval)。
审计思路:
· 全局搜索Db::query、Db::execute等原生查询方法。
· 搜索input获取的参数,追踪其使用路径。
· 检查上传功能点,查看文件保存逻辑。
· 查看权限验证中间件或基类控制器的_initialize方法。
📌 总结
-
原生PHP是基础,理解超级全局变量、弱类型、Session机制对代码审计至关重要。
-
框架安全不仅取决于框架本身,更取决于开发者的使用方式。遵循框架规范,使用参数绑定、输入过滤、权限验证是基本要求。
-
代码审计需要结合业务逻辑,关注输入点、敏感函数、配置文件等。工具扫描辅助,人工审计为主。
-
持续学习:关注框架更新和漏洞公告,参考开源审计案例提升实战能力。
安全开发,始于规范,成于审计。希望这份笔记能帮助你在WEB开发与安全审计的道路上走得更远!
参考资料:
· ThinkPHP官方手册:https://www.kancloud.cn/manual/thinkphp5
· ThinkPHP漏洞集合:https://github.com/Mochazz/ThinkPHP-Vuln
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet 萧瑶 萧瑶《第31天-WEB开发安全审计学习笔记:从原生PHP到ThinkPHP框架实战》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论