patricksavalle/slim-request-params

为 SLIM 3.x PHP 框架添加请求参数验证

v1.2 2022-10-19 14:05 UTC

This package is auto-updated.

Last update: 2024-09-12 00:29:29 UTC


README

需要 PHP 7.x

使用正则表达式验证请求 查询参数正文参数 ($_GET 和 $_BODY) 以及 HTTP 头部。为您的 API 代码添加一层安全性和自文档功能。使用与 SLIM 用于路由段的相同语法。

示例

use SlimRequestParams\QueryParameters;

$slimapp->get('', ...)
    ->add(new QueryParameters([
        '{text:\w+}',
        '{fromdate:\date}',
        '{distance:\float},0.0',
        '{orderby:(name|date)},name',
        '{reversed:\bool},false',
        '{offset:\int},1',
        '{count:\int},100',
    ]);

例如,这将接受此请求

GET yourdomain.com?text=airplane&fromdate=2016-10-10

例如,它将拒绝这些请求

GET yourdomain.com?text=airplane&fromdate=2016-10-10&whatever=23
GET yourdomain.com?text=airplane&fromdate=date
GET yourdomain.com?fromdate=2016-10-10&whatever=23
GET yourdomain.com?text=airplane&
GET yourdomain.com

等等。

0. 使用 Composer 安装

  • 更新您的 composer.json 以需要 patricksavalle/slim-request-params

  • 运行 composer install 以将 slim-request-params 添加到您的 vendor 文件夹。

    {
      "require": {
        "patricksavalle/slim-request-params": "^1.0"
      }
    }
  • 在源代码中包含。

    <?php
    
    require './vendor/autoload.php';

1. 将中间件添加到 SLIM 路由中

用于验证请求参数

use SlimRequestParams\QueryParameters;

$slimapp->get(...)
    ->add(new QueryParameters([
        '{author:[\w-. @]+}',
        '{orderby:\w+},id',
        '{reversed:1},1',
        '{offset:\int},1',
        '{count:\int},100',
        '{*}',
    ])

用于验证正文参数(客户端作为 x-www-form-urlencoded 提交)

use SlimRequestParams\BodyParameters;

$slimapp->post(...)
    ->add(new BodyParameters([
        '{recipient:.*}',
        '{sender:.*}',
        '{subject:.*}',
        '{timestamp:.*}',
        '{token:.*}',
        '{signature:.*}',
        '{*}',
    ]));

用于验证请求头部(确保它们存在并且其值遵循特定模式)

use SlimRequestParams\RequestHeaders;

$slimapp->post(...)
    ->add(new RequestHeaders([
        '{HTTP_REFERER:\url}',
        '{HTTP_CB_SIGNATURE:.*}',
    ]));

用于禁止路由的参数

$slimapp->get(...)
    ->add(new QueryParameters)

验证规则的通用格式

{<name>:<regex>},<optional_default_value>

缺失的参数将设置为给定的默认值。

显式地将值设置为 null

/someurl?key=  (leave value empty) 

额外的参数将生成错误,除非使用通配符参数: {*},在这种情况下,额外的参数将未经验证传递。

接受 RFC 标准查询参数数组,而不是 PHP 版本

/someurl?a=10&a=11&a=12

对于类型参数和特殊格式,可以使用以下关键字代替正则表达式

\boolean
\int
\float
\date
\raw
\base64json
\url
\email
\country
\nationality
\timezone
\currency
\language
\bitcoinaddress
\moneroaddress
\xtext   (a XHTML fragment only using text formatting tags, tidies up the text)

这些只是语法检查!还有一个接受“任何其他内容”的参数

{*}

可选参数应获取默认值

\optional

(见上方代码示例)

RequestHeaders 中间件始终接受“任何其他内容”。

2. 在 SLIM3.x 中安装策略以访问验证后的参数

添加将 URL、查询和 POST 参数以及请求头部组合成一个对象的策略。

$slimapp->getContainer()['foundHandler'] = function () {
    return new RequestResponseArgsObject;
};        

3. 调整您的路由处理程序以适应新策略

一个完整的示例。

<?php

declare(strict_types = 1);

namespace YourApi;

define("BASE_PATH", dirname(__FILE__));

require BASE_PATH . '/vendor/autoload.php';

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use \SlimRequestParams\BodyParameters;
use \SlimRequestParams\QueryParameters;
use \SlimRequestParams\RequestResponseArgsObject;

$app = new \Slim\App;

$app->getContainer()['foundHandler'] = function () {
    return new RequestResponseArgsObject;
};

$app->get('/hello/{name}', function (Request $request, Response $response, \stdClass $args) {
    $name = $args->name;
    $text = $args->text;
    $referer = $args->referer;
    $response->getBody()->write("$text, $name, $referer");
    return $response;
})
    ->add(new RequestHeaders(['{HTTP_REFERER:\url']))
    ->add(new QueryParameters(['{text:[\w-.~@]+},Hello']));

$app->run();

要从应用程序的任何位置检索或检查验证后的参数,只需使用

\SlimRequestParams\QueryParameters::get();
\SlimRequestParams\BodyParameters::get();
\SlimRequestParams\RequestHeaders::get();