讲师中心 微信公众号
AI工具推荐 视频效率加速

ThinkPHP 5.1 防止 API 接口参数篡改的签名算法【防刷】

星敏酱_9396

星敏酱_9396

发布时间:2026-07-11 09:51:20

|

835人浏览过

|

来源于php中文网

原创

根本原因是签名算法漏校验timestamp、nonce未去重、拼接用urlencode而非rawurlencode导致HMAC-SHA256不一致;验签必须在中间件中统一处理,严禁放在控制器内。

thinkphp 5.1 防止 api 接口参数篡改的签名算法【防刷】

ThinkPHP 5.1 项目上线后遭遇批量伪造下单请求,参数被恶意篡改却未被拦截——根本原因不是没加签名,而是签名算法漏掉了 timestamp 校验、nonce 未去重、拼接字符串时用了 urlencode 而非 rawurlencode,导致服务端与客户端算出的 HMAC-SHA256 值永远不一致。

签名验证必须放在中间件里

新建中间件:执行 php think make:middleware CheckApiSign,在 app/middleware.php 中注册,确保它排在路由解析之后、业务控制器之前。

中间件 handle 方法开头就提取签名,失败立即返回 json(['code'=>401,'msg'=>'sign invalid']) 并终止流程,不放行到任何控制器。

【关键】控制器里写验签等于把锁装在屋里——恶意参数已触发日志写入、库存扣减甚至数据库事务,验签失去意义。

立即学习“PHP免费学习笔记(深入)”;

统一获取原始参数并归一化

第一步:调用 $raw = $request->getInput() 一次性读取 php://input 流;若为空,则 fallback 到 file_get_contents('php://input')。

第二步:根据 $request->header('content-type') 分支处理:
含 application/json → json_decode($raw, true);
否则 → parse_str($raw, $body)。

第三步:合并参数:$params = array_merge($request->get(), $body ?: []);,再对每个值执行 trim(str_replace(["\r","\n"], '', (string)$v)) 清除隐藏字符。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

第四步:剔除非业务字段:unset($params['sign'], $params['signature'], $params['timestamp'], $params['nonce']);,但必须先 isset() 判断是否存在,避免 Notice 报错。

构造签名原文的三要素

方法一:基础拼接(适用于 GET/简单表单)
对 $params 执行 ksort($params, SORT_STRING);
遍历拼接 rawurlencode($k).'='.rawurlencode($v),用 & 连接;
追加 &timestamp=xxx&nonce=yyy(注意:timestamp 必须是客户端传入的 Unix 秒级时间戳);
最后拼上密钥:$data = $query_string . '&timestamp=' . $ts . '&nonce=' . $nonce . '&key=' . config('api.sign_key');。

方法二:带 HTTP 方法和路径(防接口挪用)
取 $method = strtoupper($request->method()); 和 $uri = parse_url($request->url(), PHP_URL_PATH);;
签名原文格式:$method . "\n" . $uri . "\n" . $query_string . "\n";
【关键】换行符必须是 \n,不能是 \r\n,否则哈希值错位。

计算与比对签名

用 hash_hmac('sha256', $data_string, config('api.sign_key'), true) 计算二进制签名,再 base64_encode() 编码为字符串。

从 Header 取签名:$clientSign = $request->header('X-Signature');,绝不用 $request->param('sign')——后者可能被业务参数污染。

用 hash_equals($serverSign, $clientSign) 比对,防止时序攻击;ThinkPHP 5.1 需自行引入该函数或使用 ==(低风险场景)。

校验 timestamp:取 abs(time() - $ts) > 300,超时直接拒掉;nonce 存 Redis:Redis::setex('nonce:' . $nonce, 600, 1),若已存在则验签失败。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3128

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4729

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3769

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

446

2026.01.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5616

2023.08.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

60

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

20

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn