Slim-4.x php审计 前言篇

00x0 环境搭建

下载:https://getcomposer.org/download/

php 复制代码
D:\phpstudy_pro\Extensions\php\php-8.4.16\php.exe D:\composer.phar install
cd C:\Users\jc\Desktop\Slim-4.x
D:\phpstudy_pro\Extensions\php\php-8.4.16\php.exe -S localhost:9999 -t public

开启成功

php需要大于8.0

00x1 php框架概念

PHP框架就是一种可以在项目开发过程中,提高开发效率,创建更为稳定的程序,并减少开发者重复编写代码的基础架构。PHP框架是将不同Web系统开发过程中的共性、通用部分功能进行抽象,形成开发Web程序的基本架构。进行Web系统开发时,开发人员如果在PHP框架基础上进行二次开发,即可大大简化开发过程,快速实现系统功能。PHP框架能促进Web系统的快速开发、节约时间、减少重复代码量,并能帮助初学者创建规范、稳定的Web系统。

框架它提供了一套标准的开发流程和工具集,包括数据库操作、路由管理、模板引擎、安全机制等,旨在提高开发效率和代码质量。

框架的优势

  • 加速开发:通过预定义的代码结构和库,减少重复编写代码的时间。
  • 易于维护:清晰的代码结构和文档,便于团队协作和维护。
  • 安全性高:框架内置的安全机制可以有效防止常见的安全漏洞。
  • 扩展性强:丰富的社区支持和插件库,易于集成第三方服务。

常见php框架有 Zend Framework ,CakePHP, Yii, ThinkPHP ,Codelgniter

参考:https://developer.baidu.com/article/details/3322267

https://baike.baidu.com/item/PHP%E6%A1%86%E6%9E%B6/5845631

00x2 Slim-4.x 简介

Slim 4 是一个微型 PHP 框架,用于构建简单的、强大的 web 应用程序和 API。它提供了路由、中间件和依赖注入等核心功能,使得开发者能够快速构建高性能的应用程序。

使用此框架应用程序快速设置并开始处理新的Slim Framework 3应用程序。此应用程序使用最新的Slim 3和PHP-View模板渲染器。它还使用Monolog记录器。

此框架应用程序是为Composer构建的。这样可以快速轻松地设置新的Slim Framework应用程序。

源码以及文档 https://github.com/slimphp/Slim

参考 https://blog.csdn.net/gitblog_00758/article/details/141841432

https://www.cnblogs.com/xdtx/p/10948562.html

00x3 Composer

Composer 不是一个包管理器(包管理器类似python的pip,Node的npm)。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。

也就是说Composer依赖下载的组件只在一个项目内生效。

这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。

Composer 将这样为你解决问题:

a) 你有一个项目依赖于若干个库。

b) 其中一些库依赖于其他库。

c) 你声明你所依赖的东西。

d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。

参考 https://docs.phpcomposer.com/00-intro.html

如果没有Composer,你得去 GitHub 或 Packagist 一个个下载

· slim/slim 主包

· psr/container(slim 依赖的)

· psr/http-message(slim 和 guzzle 都依赖的)

· monolog/monolog 主包

· psr/log(monolog 依赖的)

· guzzlehttp/guzzle 主包

· psr/http-client(guzzle 依赖的)

解决版本兼容问题等等

有了composer后,运行 composer install,它自动下载所有包(包括传递依赖),并且自动处理好版本冲突------如果发现冲突,它会直接报错告诉你"无法安装",而不是让你陷入手动调版本的泥潭。

运行 composer install 时,Composer 通过composer.json寻找需要下载的库并把组件代码下载到 vendor 目录

php 复制代码
//composer.json
{
//包名
    "name": "slim/slim",
//什么类型
//这是一个库
    "type": "library",
//注释
    "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
//注释
    "keywords": ["framework","micro","api","router"],
//版权信息
    "homepage": "https://www.slimframework.com",
//作者
    "license": "MIT",
//找帮助
    "authors": [
        {
            "name": "Josh Lockhart",
            "email": "hello@joshlockhart.com",
            "homepage": "https://joshlockhart.com"
        },
        {
            "name": "Andrew Smith",
            "email": "a.smith@silentworks.co.uk",
            "homepage": "https://silentworks.co.uk"
        },
        {
            "name": "Rob Allen",
            "email": "rob@akrabat.com",
            "homepage": "https://akrabat.com"
        },
        {
            "name": "Pierre Berube",
            "email": "pierre@lgse.com",
            "homepage": "https://www.lgse.com"
        },
        {
            "name": "Gabriel Manricks",
            "email": "gmanricks@me.com",
            "homepage": "http://gabrielmanricks.com"
        }
    ],
//文档
    "support": {
        "docs": "https://www.slimframework.com/docs/v4/",
        "forum": "https://discourse.slimframework.com/",
        "irc": "irc://irc.freenode.net:6667/slimphp",
        "issues": "https://github.com/slimphp/Slim/issues",
        "rss": "https://www.slimframework.com/blog/feed.rss",
        "slack": "https://slimphp.slack.com/",
        "source": "https://github.com/slimphp/Slim",
        "wiki": "https://github.com/slimphp/Slim/wiki"
    },
//equire 是一个键,它的值是一个对象(用 {} 包裹)
    "require": {
//兼容版本范围
        "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
//开启extension扩展       
"ext-json": "*",
//nikic/fast-route路由也是标识符,文件夹路径,^1.3版本限制
        "nikic/fast-route": "^1.3",
        "psr/container": "^1.0 || ^2.0",
        "psr/http-factory": "^1.1",
        "psr/http-message": "^1.1 || ^2.0",
        "psr/http-server-handler": "^1.0",
        "psr/http-server-middleware": "^1.0",
        "psr/log": "^1.1 || ^2.0 || ^3.0"
    },
//开发依赖
    "require-dev": {
//SimpleXML拓展
        "ext-simplexml": "*",
        "adriansuter/php-autoload-override": "^1.4 || ^2",
        "guzzlehttp/psr7": "^2.6",
        "httpsoft/http-message": "^1.1",
        "httpsoft/http-server-request": "^1.1",
        "laminas/laminas-diactoros": "^2.17 || ^3",
        "nyholm/psr7": "^1.8",
        "nyholm/psr7-server": "^1.1",
        "phpspec/prophecy": "^1.19",
        "phpspec/prophecy-phpunit": "^2.1",
        "phpstan/phpstan": "^1 || ^2",
        "phpunit/phpunit": "^9.6 || ^10 || ^11 || ^12",
        "slim/http": "^1.3",
        "slim/psr7": "^1.6",
        "squizlabs/php_codesniffer": "^3.10",
        "vimeo/psalm": "^5 || ^6"
    },
//自动加载规则,所有Slim\\命名的命名空间去Slim文件夹下找对应的php文件
//如new Slim\APP(),Slim/App.php
//当你执行 composer install 后,Composer 会根据 autoload 配置生成一个文件:
//vendor/autoload.php。
//你在项目入口引入它才可以使用
//require __DIR__ . '/../vendor/autoload.php'
    "autoload": {

        "psr-4": {
            "Slim\\": "Slim"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Slim\\Tests\\": "tests"
        }
    },
//这是为开发者定义的快捷命令。在命令行直接运行 composer test,Composer 就会依次执行 phpunit、phpcs、phpstan、psalm 这些命令,相当于一键运行整个测试和检查流程。@phpunit 这种写法就是调用下面定义的 phpunit 脚本。
//composer命令开始自动执行
    "scripts": {
        "test": [
            "@phpunit",
            "@phpcs",
            "@phpstan",
            "@psalm"
        ],
        "phpunit": "phpunit",
        "phpcs": "phpcs",
        "phpstan": "phpstan --memory-limit=-1",
        "psalm": "psalm --no-cache"
    },
//这里是一些可选建议,告诉使用者如果想用某些特性,需要额外安装什么。
    "suggest": {
        "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware",
        "ext-xml": "Needed to support XML format in BodyParsingMiddleware",
        "slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information.",
        "php-di/php-di": "PHP-DI is the recommended container library to be used with Slim"
    },
//这是一些给 Composer 本身用的配置。sort-packages 意思是当你用 require 命令安装新包时,会自动在 composer.json 的 require 列表里按包名排序,保持文件整洁。
//当你用 composer require 命令下载新包时,Composer 会自动做两件事:
//把这个新包的条目添加到 composer.json 的 require(或 require-dev)列表里。
//同时下载这个包的代码到 vendor 目录。
/*1. Composer(通过 composer.phar)读取当前目录下的 composer.json 文件,里面记录着项目的依赖清单。
2. 根据清单里的包名和版本约束,去仓库(如 Packagist)查找并下载对应的代码,放到 vendor 目录里。
3. 当你以后想安装新的包时,直接运行 composer require 包名,Composer 不仅会把包下载下来,还会自动把这条新依赖写入 composer.json 的 require 部分(如果开启了排序,还会按字母顺序排好)。同时,它也会更新 composer.lock 文件,记下所有包的精确版本。*/
    "config": {
        "sort-packages": true
    }
}
php 复制代码
<?php

// autoload.php @generated by Composer

if (PHP_VERSION_ID < 50600) {
//检查 HTTP 响应头是否已经被发送到浏览器。
    if (!headers_sent()) {
//没有就500
        header('HTTP/1.1 500 Internal Server Error');
    }
//php_eol是一个已经定义好的变量,代表php的换行符,这个变量会根据平台而变,在windows下会是"/r/n",在linux下是"/n",在mac下是"/r"
    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
//主要用于获取php.ini配置文件中的指定选项值。其语法为,通过传入配置变量名返回对应的字符串值,布尔型配置项则返回0或1。
//如果没有配置
    if (!ini_get('display_errors')) {


//内置调试器
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
//fwrite()是PHP编程语言中用于向文件写入数据的核心函数
//写入信息
//错误流,输出到面板STDERR
            fwrite(STDERR, $err);
        } elseif (!headers_sent()) {
            echo $err;
        }
    }
//抛出报错,脚本停止
    throw new RuntimeException($err);
}
//引用文件
require_once __DIR__ . '/composer/autoload_real.php';
// 调用自动加载器类的静态方法 getLoader(),返回已注册的自动加载器实例
// 这个返回值通常不会直接使用,但 Composer 内部通过它完成自动加载注册
//自动加载核心判断
return ComposerAutoloaderInit7ab6fc67c2c3b4adad7f8aabf0580255::getLoader();

00x4 依赖

什么是依赖(Dependencies)?

依赖就是你的程序要"借力"的外部资源,通常是库、工具或框架。它们就像搭积木时用的现成模块,让你不用事事从零做起。

比如:

写 Python 的时候,会用 requests 这个库来抓网页数据;

前端项目常用 React.js 来搭建界面。

这些依赖本身也不是"孤岛",它们往往也依赖其他东西。比如 React 需要某个版本的 Node.js,而 Node 也可能有自己的依赖链。这个结构就像俄罗斯套娃,层层叠叠,错一个都不行。

依赖存在的意义在于:

提升效率:你只需要关注项目核心逻辑,重复的功能可以直接用别人的成果;

系统更稳更好扩展:很多库是大型社区维护的,已经在各种项目中验证过,拿来用更省心。

但这也意味着,如果你装了不合适的版本,或者哪一环有冲突,问题就会像连环雷一样爆出来,而且往往不好查。

依赖 ≈ 组件 ≈ 第三方库。

参考:https://blog.csdn.net/2509_92130319/article/details/148064779

00x5 Slim框架结构

Slim框架十分简洁

vendor是依赖文件包

public是web服务根目录入口文件

sLIM框架本体

00x6 Slim路由规则

php 复制代码
<?php
//use为类起一个别名
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
//导入工厂类
use Slim\Factory\AppFactory;
//引用文件,规则加载
//自动加载规则,所有Slim\\命名的命名空间去Slim文件夹下找对应的php文件
//如new Slim\APP(),Slim/App.php
require __DIR__ . '/../vendor/autoload.php';
//发力了
//自动触发加载器
//::调用静态方法
//create()实例化App()
$app = AppFactory::create();
//注册get请求,传路由路径
//  · $request:当前 HTTP 请求对象,包含请求参数、头信息等。
 // · $response:当前 HTTP 响应对象,用于构建返回内容。
 // · $args:路由参数数组(本例中没有动态参数,所以为空)。
$app->get('/', function (Request $request, Response $response, $args) {
//获取响应,写入"Hello, Slim!"
    $response->getBody()->write("Hello, Slim!");
//返回给框架
    return $response;
});
//运行应用
$app->run();
php 复制代码
//public static function create(): App {方法签名
//返回APP类型
//{方法体执行里面的代码

public static function create(
//组件
//可选,可选数量,有默认
        ?ResponseFactoryInterface $responseFactory = null,
        ?ContainerInterface $container = null,
        ?CallableResolverInterface $callableResolver = null,
        ?RouteCollectorInterface $routeCollector = null,
        ?RouteResolverInterface $routeResolver = null,
        ?MiddlewareDispatcherInterface $middlewareDispatcher = null
    ): App {
        static::$responseFactory = $responseFactory ?? static::$responseFactory;
//返回
        return new App(
//调用静态方法
            self::determineResponseFactory(),
            $container ?? static::$container,
            $callableResolver ?? static::$callableResolver,
            $routeCollector ?? static::$routeCollector,
            $routeResolver ?? static::$routeResolver,
            $middlewareDispatcher ?? static::$middlewareDispatcher
        );
    }
相关推荐
沐知全栈开发1 小时前
HTML 列表
开发语言
froginwe112 小时前
HTML 实例详解
开发语言
知我Deja_Vu2 小时前
【避坑指南】ConcurrentHashMap 并发操作的致命陷阱
java·开发语言
广州服务器托管2 小时前
WIN11中将控制面板固定到开始菜单的方法
运维·开发语言·windows·计算机网络·可信计算技术
X在敲AI代码2 小时前
D32次 第2题 因子化简
开发语言·c++
沙漏无语2 小时前
(一)TiDB简介
java·开发语言·tidb
小杍随笔2 小时前
【Rust `lib.rs` 使用方法:模块组织、API导出与最佳实践】
服务器·开发语言·rust
lly2024062 小时前
SQLite Truncate Table: 深入理解与最佳实践
开发语言
csdn_life182 小时前
# Debian 10 升级到 Debian 13 指南
运维·debian·php