0

0

短链接还原php后地址不对_检查加密密钥是否匹配【操作】

看不見的法師

看不見的法師

发布时间:2026-01-01 21:01:46

|

792人浏览过

|

来源于php中文网

原创

短链接跳转后目标URL错误,主因是密钥不一致、base64 padding缺失、未校验HMAC签名、编解码顺序颠倒;需逐一排查密钥配置、补全padding、强制签名验证、严格按base64_decode→urldecode→json_decode顺序处理。

短链接还原php后地址不对_检查加密密钥是否匹配【操作】

短链接跳转后目标 URL 不对,先查 hash_hmac 密钥是否一致

PHP 短链接还原逻辑常依赖 hash_hmac 生成签名来验证和反解原始 URL。如果还原出的地址错误(比如多出字符、截断、乱码或指向错误域名),大概率是加解密环节的密钥不匹配——不是“没配”,而是“配错了位置”或“类型不一致”。

  • 检查短链接生成时用的密钥(如 $secret_key = 'abc123')和还原时用的是否完全相同,包括大小写、空格、不可见字符
  • 确认两端 PHP 文件没有因 include 路径问题加载了不同配置文件,比如一个读 config.php,另一个读了 config.local.php
  • 如果密钥来自环境变量(如 $_ENV['SHORT_URL_SECRET']),需验证该变量在 CLI 和 Web SAPI 下是否都已正确加载(phpinfo()var_dump($_ENV) 查看)

还原函数里 base64_decode 处理前是否补足了 padding

短链接 ID 经常是 base64url 编码(去掉了 +/,并省略末尾 =)。直接丢给 PHP 原生 base64_decode 会失败或解出乱码,导致后续解析 URL 出错。

  • 还原前必须手动补全 padding:把 - 换成 +_ 换成 /,再按长度补 = 到 4 的倍数
  • 错误示例:base64_decode('aGVsbG8') → 返回 false(缺 padding);正确应为 base64_decode('aGVsbG8=')
  • 推荐封装处理函数,避免每次手写:
function urlsafe_b64decode($input) {
    $remainder = strlen($input) % 4;
    if ($remainder) {
        $input .= str_repeat('=', 4 - $remainder);
    }
    return base64_decode(strtr($input, '-_', '+/'));
}

还原时没校验 HMAC 签名就直接解密,导致恶意篡改被当作合法请求

很多实现只做“能解出来就行”,跳过了签名验证。攻击者可随意修改短链 ID 后半段,伪造出看似合法但目标 URL 完全不同的链接(例如把 https://a.com 变成 https://evil.com)。

  • 还原流程必须是:取 ID → 拆出数据体和签名 → 用相同密钥和算法重新计算 HMAC → 对比是否恒等(用 hash_equals(),防时序攻击)
  • 签名算法要统一,常见是 sha256,别一端用 sha1,另一端用 sha256
  • 如果数据库存的是明文 URL + 独立签名字段,注意还原时不能只靠 ID 反查,必须验证签名后再取对应记录

URL 解码顺序错乱:先 urldecodejson_decode,还是反过来?

原始 URL 被编码进短链 ID 前,通常会先 json_encode(含双引号、斜杠转义),再 urlencode(处理中文、问号等)。还原时顺序反了,就会出现 %22https%3A%2F%2F... 这类嵌套编码残留。

造好物
造好物

一站式AI造物设计平台

下载

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

  • 正确顺序:base64 解码 → urldecodejson_decode
  • 典型错误:json_decode(urldecode(base64_decode($id))) ✅;urldecode(json_decode(base64_decode($id))) ❌(此时 JSON 字符串本身含 % 编码,json_decode 会失败或误解析)
  • 若原始存储用了 rawurlencode,还原时就得用 rawurldecode,二者不兼容

密钥不一致、padding 缺失、跳过签名校验、编解码顺序颠倒——这四个点覆盖了 90% 的“还原地址不对”问题。尤其注意密钥是否真的被两个上下文同时读到,而不是你以为它在那儿。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2001

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1326

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1230

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1230

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号