如何在中间件过滤参数?

andyzu
<?php

namespace app\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

class ParamFilterMiddleware implements MiddlewareInterface
{
    public function process(Request $request, callable $handler): Response
    {
        // 获取 POST 参数
        $param = $request->post();

        // 确保 $param 是数组
        if (!is_array($param)) {
            $param = [];
        }

        // 过滤参数
        $param = array_map(function($value) {

            // 去除空格
            $value = trim($value);

            // 去除 HTML 标签
            $value = strip_tags($value);

            // 进一步过滤 SQL 注入风险
            $value = preg_replace('/[\'\"\\\;]+/', '', $value); // 去除引号和分号等
//            dump($value);
            return $value;
        }, $param);

        dump('------------------',$param);
        // 将过滤后的参数重新设置回请求
        $request->post($param);

        return $handler($request);
    }
}

我写了个过滤的中间件,并且注册了中间件:

return [
    // 全局中间件
    '' => [
        // 过滤请求参数的中间件
        \app\middleware\ParamFilterMiddleware::class,
    ]

];

但是我在控制器里用 $param = $request->all(); 或者 $param = $request->post(); 接收不到,啥原因?

197 2 1
2个回答

古树

$request->post($param);

这个post只能取值,不能赋值

  • 暂无评论
tanhongbin

用orm 就不用担心注入的问题了,最好不要自己手动拼接sql 代码复杂度高不说 还容易出问题

  • 暂无评论
×
🔝