首页 / 资讯中心 / 文章详情

YOURLS 版本演进深度解读:从 CHANGELOG 看自托管短链系统 1.0 到 1.10 的安全加固与架构变迁

YOURLS 版本演进深度解读:从 CHANGELOG 看自托管短链系统 1.0 到 1.10 的安全加固与架构变迁 ★ FEATURED ARTICLE
后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载本文以 YOURLS 官方仓库的 CHANGELOG.md 为主线结合includes/目录下的源码实现系统梳理 YOURLS 自 1.0 初版到当前 1.10.x 系列的全部版本脉络重点解读 1.10.x 的安全加固细节、PHP 版本兼容性路线图、插件体系与数据库架构的演进过程。读完本文你将能够快速定位任意版本的核心变更与升级要点理解hash_equals、cookie 前缀、409 状态码等安全与语义改进在源码中的落地位置掌握从老版本升级时需要注意的 PHP 门槛与数据库迁移风险。当前版本状态与版本号机制在展开版本史之前先明确仓库当前的版本坐标。仓库根目录下的 includes/version.php 定义了 YOURLS 的版本机制define( YOURLS_VERSION, 1.10.7-dev ); // 当前开发版 define( YOURLS_DB_VERSION, 507 ); // 数据库 schema 版本YOURLS_VERSION遵循MAJOR.MINOR[.PATCH][-SOMETHING]的格式约定-dev后缀表示尚未正式发布的开发版本YOURLS_DB_VERSION是一个整数形式的字符串每当数据库表结构发生变更时递增从而在升级时触发数据库更新流程对应 includes/functions-upgrade.php 中定义的升级逻辑。这一点与 CHANGELOG 中 1.10.6 的条目直接呼应——该版本的唯一内容就是修正版本号它只是1.10.5去掉-dev因为本应如此。可见 YOURLS 对版本号与发布状态的严谨态度也提醒我们在查看发行版本时注意-dev后缀的语义。1.10.x 系列安全加固的集中爆发期1.10.x 是 CHANGELOG 中篇幅最大、信息密度最高的版本段其核心主题是安全加固与PHP 8.x 兼容性。这既是当前代码库实际状态的反映也是升级到最新版的核心动机。1.10.5一批高价值的安全加固1.10.5 的条目以 numerous misc security hardenings多项杂项安全加固开头涉及至少 7 个 PR逐条展开如下1md5逐步退出CHANGELOG 明确 md5now phased outmd5 已被逐步淘汰。在源码 includes/functions-auth.php 中可以看到对应实现yourls_has_md5_password()约第 326 行检测形如md5:[38 chars]的历史遗留密码哈希yourls_has_md5_passwords()约第 306 行遍历所有用户判断是否存在仍在使用 md5 密码的情况密码比对统一改为原生password_hash/password_verify体系自 1.9 移除ozh/phpass库之后。2全面使用hash_equals()抵御时间侧信道攻击CHANGELOG 指出 extensive use ofhash_equals()to beat time based attacks广泛使用hash_equals()以击败基于时间的攻击。hash_equals是 PHP 提供的恒定时间字符串比较函数可防止攻击者通过响应耗时差异逐字节猜测哈希值。在源码中可以看到它在以下关键路径的落地includes/functions-auth.php明文密码比对约第 169 行Cookie 认证校验约第 361 行yourls_check_auth_cookie()带时间戳的 API 签名校验约第 407、409 行无时间戳的 API 签名校验约第 453 行nonce 校验约第 823 行。3引入 cookie 前缀为防范 Cookie 名称冲突与跨站点干扰1.10.5 实现了 cookie 前缀机制。源码中的yourls_cookie_name_prefix()includes/functions-auth.php 约第 608 行与yourls_cookie_name()约第 677 行共同构造形如前缀yourls_基于站点 salt 的哈希的 cookie 名称。CHANGELOG 特别说明该前缀由YOURLS_COOKIEKEY派生保证同一域名下部署多个 YOURLS 实例时 cookie 互不干扰这一修复的历史根源可追溯到 1.7.1 中同一域名的多个子域部署导致 cookie 不匹配而无法登录的问题。4YOURLS_COOKIEKEY未定义时不可预测在 includes/Config/Config.php 中可以看到配置校验逻辑约第 144、158 行会强制要求YOURLS_COOKIEKEY为长随机字符串若其仍是示例值或未定义则抛出ConfigException。1.10.5 的改进在于即使未由用户显式定义系统也会生成不可预测的随机值避免弱密钥风险。5限制公网安装的远程标题抓取remote title fetching restricted on a public install when shortening private IP——当站点为公网安装时若尝试缩短指向私有 IP 的 URL将限制远程标题抓取以防止 SSRF 类攻击。仓库测试目录中的 tests/data/scripts/scenarios/restrict-remote-title-fetch.php 即为该行为的专门测试场景。6极罕见条件下防止 Pages 的未认证文件包含prevent unauthenticated file inclusion in Pages under very unlikely conditions——修复了在极罕见条件下Pages 功能可能发生未认证文件包含的问题。7更好的代理支持better support for proxies——延续 1.7.9 以来的代理兼容性工作改进在反向代理、负载均衡等部署形态下的请求处理。1.10.5 的语义变更重复长 URL 返回 HTTP 409 而非 400这是 1.10.5 中唯一一条 changed 类条目也是 API 语义上的一次重要调整ReturnHTTP 409 Conflictinstead of400when a duplicate long URL is rejected (#4133)当关闭重复长 URL 时向 API 提交已存在的长 URL 会被拒绝。旧版本返回400 Bad Request新版本改为409 Conflict——语义上更准确请求本身合法冲突在于资源已存在。源码佐证位于 includes/functions-shorturls.php 第 88 行$return[errorCode] $return[statusCode] 409; // 409 Conflict: the URL already exists, and the existing short URL is returned同时 includes/functions.php 第 539 行维护着 HTTP 状态码文本映射表409 Conflict。值得注意的是该函数返回数组中的statusCode/errorCode一律为字符串——这正是 1.10.0 中 Ensure allstatusCode/errorCodeAPI values are strings (#3756) 的落地成果API 消费方尤其是做类型严格判断的客户端需要留意这一约定。1.10.4XSS 修复与本地化、过滤钩子1.10.4 的关键条目包括修复统计页 XSS通过 referrer来源引用注入的 XSS 已在统计页修复对应安全公告 GHSA-5h77-88j3-r659日期与时间的本地化支持#4054配合 1.9 起不断完善的 l10n 体系见 includes/functions-l10n.php改进 shunt filters#4058shunt分路过滤器是 YOURLS 插件体系中用于拦截/改写请求流程的一类钩子过滤 SQL 查询#4064在数据库层引入查询过滤钩子为插件审计或改写 SQL 提供了入口修复管理面板 Logo 重叠、环境变量密码文件误判等小问题并改进了调试函数与测试调试体验。1.10.3性能、健壮性与体验修复1.10.3 是 1.10.x 中功能条目最多的小版本新增 PHP 8.5 与 8.6 的测试覆盖#4036配合 1.10.0 的 PHP 8.3/8.4 支持可见 YOURLS 持续跟随 PHP 官方发布节奏新增从全局变量获取保留 URL 的函数#3999并修复保留 URL 配置缺失或无效导致崩溃的问题——这与 includes/functions-shorturls.php 中yourls_keyword_is_free()等关键字保留逻辑直接相关为长 URL 增加数据库索引#4013加速按长 URL 检索的速度对应 1.4 引入的url存储字段yourls_get_db()新增$context参数#4020允许调用方指定数据库连接上下文默认在公开统计页隐藏 referrer#4005与 1.10.4 的 referrer XSS 修复形成呼应增删改 URL 后同步刷新该关键字的 infos 缓存#4008表格悬停操作的可访问性改进#4025与删除链接改为模态对话框二次确认#3932修复若干边界问题升级 spatie/array-to-xml 以消除新版 PHP 的弃用警告、修复点击数大于 0 的筛选、修复管理后台搜索的大小写敏感性、修复远程站点非法字符集处理、保留 URL 中的反斜杠#4000、校验 JSONP 回调名称#4030。其中校验 JSONP 回调名称尤为重要JSONP 接口通过回调函数名注入脚本若未校验则可能构成反射型 XSS。对应测试可见 tests/tests/format/JsonpCallbackTest.php。1.10.2 / 1.10.1 / 1.10.6收尾修复1.10.2admin/tools.php 改用yourls_get_nonce_life()该函数定义于 includes/functions-auth.php 约第 658 行返回 nonce 的有效生命周期默认 60 秒可通过nonce_life过滤器调整修复管理列表页 Display 1 to 0 of 0 URLs 的计数显示用 action 取代已弃用的get_all_options过滤器延迟到插件加载后再加载文本域#3679移除 Gandi 相关引用。1.10.1修复禁用插件时沙箱sandbox抛出的异常#3893、统计日期计算错误#3895、登录页意外警告移除不支持的 Composer 安装场景。1.10.6仅修正版本号去掉-dev。1.10.0PHP 8.3/8.4 支持与 PHP 8.1 门槛1.10.0 是一个里程碑式的大版本其最核心的变更集中在 PHP 版本策略新增 PHP 8.3 与 8.4 支持移除对 PHP 8.1 以下版本的支持即最低要求提升到 PHP 8.1升级 Aura.SQL 以修复 PHP 8.4 兼容性#3852修复 MySQL 8 兼容性#3828延续 1.8.1 中 MySQL 8 升级流程的修复确保 API 返回的statusCode/errorCode一律为字符串#3756修复搜索中 0 点击结果不显示的问题#3589、登录页可访问性#3660升级依赖、更新 GeoIP 数据库与 CA 证书。这一版本确立了当前仓库的运行时基线PHP 8.1、MySQL 8 兼容、API 返回类型统一为字符串。对于从老版本升级的用户1.10.0 是必须跨过的版本门槛。1.9.xPHP 门槛上移与插件体系成熟1.9 系列完成了两件大事PHP 版本门槛上移与API 插件体系的工程化。1.9移除对 PHP 7.4 以下版本的支持至此 PHP 7.4 成为最低要求改进 API 插件——提供更多插件函数#3281、沙箱机制与插件卸载流程#3282改进批量缩短mass shortening时的并发处理#3233移除ozh/phpass库全面改用 PHP 原生password_*函数#3232在管理视图与搜索中新增更多钩子#3265完成若干小安全修复——升级过程中对步骤名做 sanitize#3055、登出链接增加 nonce#3264、用更新的哈希算法对 cookie 加盐#3278。1.9.1修复升级时Undefined constant intval报错#3332、PHP 8.1 下的警告#3317、API 缩短重复 URL 时错误的 HTTP 状态头#3355、随机关键字中不出现连字符#3353在 composer.json 中补充必需/建议的 PHP 扩展声明#3339。1.9.2新增 PHP 8.2 支持#3474Googlebot 索引行为改为可过滤#3517满足 SEO 定制需求所有被包含的文件使用安全沙箱#3478修复含特殊字符的 URL 的 bookmarklet#3527、多余 cookie 干扰#3516、含括号用户名支持#3365。沙箱sandbox一词在 1.9、1.9.2、1.10.1 反复出现指向 YOURLS 在加载插件代码时采用的隔离机制防止插件文件中的错误影响主程序运行——这是插件体系工程化的重要体现。1.8.xPHP 8 支持与 MySQL 8 升级兼容1.8.2修复 IE 11 下 SVG Logo 显示#2864、DB 升级流程#2933、Docker 环境误报未加密密码警告#3040安全加固——iframe 点击劫持防护与登录 nonce#3034、潜在 XSS#3041改进代理环境下的 SSL 支持#3044为 API 的versionaction 补充文档#2957管理页面、HTTP 请求、用户自定义常量新增过滤器。1.8.1修复 MySQL 8 与含连字符表名的升级流程#2844、#2846修复在私有安装中公开部分页面的函数#2859新增all钩子用于调试 YOURLS 与插件#2860。1.8正式支持 PHP 8同时移除 PHP 7.2 以下支持改善 IDN 域名与 UTF-8 URL/标题的处理CHANGELOG 称之为自第一天起的第一号问题改进时区管理管理界面与 Logo 全面 SVG 化。1.8 的 IDN/UTF-8 改进是国际化历史上最重的单笔投入为 1.10.4 的日期时间本地化奠定了技术基础。1.7.x代理兼容、API 签名与核心功能落地1.7.9改进与代理/反向代理的兼容性API 请求支持带时间戳签名 任意哈希算法自 1.7.7 起允许hash参数可选用 sha512 等算法替代默认 md5自定义页面迁移至user/目录管理主界面可访问性改进label 与 aria 标签。1.7.6Random Keywords随机关键字成为随 YOURLS 捆绑的核心插件修复 JSONP 参数与文档不一致的问题。1.7.5修复超长 referrer 或客户端名称触发错误的问题。1.7.4修复 API 中的类型混淆type juggling漏洞移除 PHP 5.5 及以下支持。1.7.3新增若干钩子以增强插件扩展性更新 jQuery 等前端库。1.7.2改进统计图表精度与时区处理改进管理界面导航移除 PHP 5.2 支持。1.7.1新增 PHP 7 兼容支持闭包形式的钩子管理界面支持跨字段全局搜索bookmarklet 源码可读、运行时压缩修复时区警告修复同一域名多子域部署时 cookie 不匹配导致无法登录的问题。1.7新增 PDO 与 MySQLi 支持数据库抽象层选择更丰富参见 includes/class-mysql.php新增社交 bookmarklet一键分享到 Twitter/Facebook/Tumblr启动时向 api.yourls.org 检查新版本支持代理部署install YOURLS behind a firewall!SQL 注入安全强化凭据自动加密改进外部 HTTP 请求处理。值得指出的是1.7.9 的时间戳签名 任意哈希在 1.10.5 中被进一步收紧签名哈希默认仅允许sha256、sha384、sha512三种除非插件通过allowed_hash_algos过滤器显式放行默认算法为 sha256对应 includes/functions-auth.php 中的yourls_default_hash_algo()与yourls_allowed_hash_algos()。md5 在 API 签名链路中也已完成退场。1.6–1.4API 能力扩张与数据库架构重构1.6新增翻译 APITranslation APICHANGELOG 用多种语言书写 Hello world! 展示其能力支持自定义 API action支持带常见协议前缀的 URL修复管理界面的搜索与分页更新 jQuery、ezSQL、GeoIP 依赖改进 sanitize 与转义函数。1.5.1完整 JSONP 支持配置文件支持加密密码/user目录自定义 favicon用 Google Visualization API 取代已弃用的 Google Charts新增大量钩子。1.5插件架构诞生plugin architecture! OMG plugins!!1!!1!引入/user目录config.php可迁移至此新增即时 bookmarklet与一键复制到剪贴板a la bitly请求处理逻辑变更——所有请求改由 PHP 处理不再依赖 .htaccess保存 URL 标题支持 prefix-n-shorten形如sho.rt/http://example.com/捆绑允许 URL 含连字符的核心插件、重定向 URL 包裹社交工具条示例插件、演示插件后台页面创建的示例插件、随机背景核心插件布局采用统一调色板增加反 XSS 与反 CSRF 措施统计页支持国家流量交互地图。1.4.3修复数据库 schema 不一致导致统计不显示的问题改进 APIurl-stat方法的错误报告。1.4.2修复认证函数 bug新增公共 API 示例文件仓库根目录可见 sample-public-api.txtAPI 请求中增加对 WordPress 插件添加短 URL 的检查。1.4.1修复 base 62 混合大小写关键字API 引入新的安全认证方法无需用户名/密码组合即签名认证的雏形见 includes/functions-auth.php 的yourls_check_signature()管理页支持强制 SSL新增单 URL 统计 API 方法阻止内部重定向循环支持按日期过滤与搜索 URL。1.4提供 1.3→1.4 升级器引入全局对象$ydb统一管理数据库启动方式变更——用load-yourls.php取代直接包含config.php即今日仓库根目录 yourls-loader.php 与 includes/load-yourls.php 职责分工的起源数据库 schema 重构——以短关键字作为 URL 存储主键、允许任意长度关键字新增 options 表替代原同名表新增 hits 表用于统计改进安装器并生成 .htaccess统计功能正式登场。1.4 的三项change in logic奠定了此后所有版本的架构骨架理解它们有助于把握 YOURLS 的启动链路入口加载 yourls-loader.php → includes/load-yourls.php → 初始化配置、数据库、插件环境。1.3–1.0早期奠基1.3-RC1新增 bookmarklet 与工具页改进新增 URL 时的 XSS 过滤重构 admin/index.php 分离代码与展示新增 favicon严格编码以消除未定义索引的 notice除非设置YOURLS_DEBUG常量为 true否则隐藏 PHP notice 与 SQL 错误/警告对应 includes/functions-debug.php 的调试体系。1.2 / 1.1 / 1.0.1CHANGELOG 以幽默口吻记载为 dont remember. A few tiny stuff for sure. 等——无需过度解读。1.0初始发布initial release。版本演进速查表版本主题关键变更1.10.6版本修正去掉-dev后缀1.10.5安全加固md5 淘汰、hash_equals全面化、cookie 前缀、YOURLS_COOKIEKEY随机化、SSRF 缓解、409 语义1.10.4安全 本地化统计页 referrer XSS 修复、日期时间本地化、SQL 查询过滤器1.10.3性能 健壮性PHP 8.5/8.6 测试、长 URL 索引、JSONP 回调校验、模态删除确认1.10.2/1.10.1收尾修复nonce 生命周期、沙箱异常、统计日期计算1.10.0PHP 8.3/8.4最低 PHP 8.1、API 状态码字符串化、MySQL 8 兼容1.9.xPHP 门槛 插件工程化最低 PHP 7.4 → 8.2 支持、API 插件沙箱与卸载、password_*取代 phpass1.8.xPHP 8 支持PHP 8 兼容、IDN/UTF-8 大改进、MySQL 8 升级修复1.7.x代理与签名代理兼容、时间戳签名、PDO/MySQLi、cookie 多子域修复1.6–1.4API 与架构翻译 API、插件架构诞生、$ydb、load-yourls.php、stats 登场1.3–1.0奠基bookmarklet、XSS 过滤、YOURLS_DEBUG调试门控、初始发布升级路线与注意事项综合 CHANGELOG从老版本升级到当前 1.10.x 的注意点可归纳为四条主线PHP 版本门槛逐级上移1.5 时代兼容 PHP 5.2此后依次移除 5.51.7.4、5.21.7.2、7.2 以下1.8、7.4 以下1.9、8.1 以下1.10.0。若目标是最新 1.10.x运行环境需满足PHP 8.1并留意 composer.json 中声明的必需/建议扩展。启动方式与配置文件路径1.4 起启动入口从config.php变为load-yourls.php1.5 起config.php可置于/user目录YOURLS_COOKIEKEY必须为长随机字符串includes/Config/Config.php 会强制校验。数据库升级YOURLS_DB_VERSION当前 507在 schema 变更时递增并触发升级流程历史上 MySQL 8、含连字符表名1.8.1、升级步骤 sanitize1.9都曾是升级事故点升级前建议备份数据库。API 语义兼容statusCode/errorCode一律为字符串1.10.0重复长 URL 被拒时返回409而非4001.10.5签名哈希默认仅允许 sha256/sha384/sha5121.10.5。API 消费方需按新语义适配。结语通过逐条拆解 CHANGELOG.md 并对照源码可以看到 YOURLS 的版本史是一条清晰的能力演进线早期1.0–1.4完成数据库与启动架构定型中期1.5–1.7确立插件体系与 API 认证模型近期1.8–1.10则聚焦 PHP 8 生态跟随、国际化完善与持续安全加固。对使用者而言这份 CHANGELOG 既是升级决策的依据也是理解当前代码库设计意图的最佳索引——例如 1.10.5 的安全条目几乎都可以在 includes/functions-auth.php 中找到对应实现而 1.10.5 的 409 语义变更则直接体现在 includes/functions-shorturls.php 的yourls_add_new_link()返回值中。研读 CHANGELOG 与源码相互印证是快速掌握这个自托管短链系统最有效的途径。赞分享后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载相关推荐bootstrap-table 版本演进全解读从 CHANGELOG 看 1.0 到 1.27 的架构变迁与技术路线bootstrap table 版本演进全解读从 CHANGELOG 看 1.0 到 1.27 的架构变迁与技术路线 导读 bootstrap table前端UI组件Markwon 版本演进全解从 1.0 到 4.6 的 Android Markdown 渲染架构变迁基于 CHANGELOG 深度解读Markwon 版本演进全解从 1.0 到 4.6 的 Android Markdown 渲染架构变迁基于 CHANGELOG 深度解读 MarkwonUI组件移动开发WeChatMsg免费开源的微信聊天记录导出工具对话转成 HTML / Word / CSV 留档WeChatMsg免费开源的微信聊天记录导出工具对话转成 HTML / Word / CSV 留档 几年的对话沉淀在微信里数据只存在手机上。免费开源的微信创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站