Skip to content

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 15:42
· 9 commits to main since this release

安全

  • 封堵验证码跨 key 无限盲猜:单 key 计数挡不住「每次换新 key 再猜一次」,新增会话/账号级窗口限流(captcha.rate_limit,默认 60 秒 30 次,身份可用 resolver 注入)
  • 小画布退化导致完全绕过:60×60 背景时点击目标全部塌缩到同一像素、100×100 背景时滑块缺口恒为 50 —— 现在边界按画布自适应,画布过小直接报错
  • 点击目标抗颜色分割:此前恒定色 + 噪声在文字之下,按色分离可 6/6 精确还原坐标;现逐目标随机色相/透明度/旋转,噪声覆盖在文字之上
  • 验证计数原子化:先原子自增、以返回值为本次尝试序号(40 并发下实际放行 9~24 次 → 3 次)
  • 畸形坐标不再触发未捕获 TypeError(500),改为返回 false 并计次
  • 新增可选的行为轨迹校验(点数/耗时/线性度,默认关闭)

修复

  • 二维码此前 100% 扫不出来:缺少 Reed-Solomon 纠错、格式信息副本坐标错误、v7 起分块表失真(v11+ 是「单块近似」)。按 ISO/IEC 18004 重写后 195/195 解码样本通过,仓库自带示例海报的二维码现已可扫
  • Imagick 驱动 PNG 输出丢 alpha:setImageFormat('png') 写 24 位,透明区域落盘变不透明 —— 圆形头像/透明水印在 GD/浏览器侧变黑块
  • 水印 spacing <= 0 死循环挂死进程(模板 JSON 可触发);间距过小导致百万次绘制的 CPU 打满面
  • 图表 colors => [] 除零崩溃;非法尺寸抛出 GD 原生 ValueError
  • 8 位色 #RRGGBBAA 的 alpha 在文字与阴影路径被丢弃:文档里的半透明水印/阴影/霓虹全部无效
  • 阴影 blur 一直无效:GD 的高斯模糊不处理 alpha 通道,而阴影形状全在 alpha 上 —— 改为掩膜模糊 + 亮度反推 alpha,现在是真软边
  • 头像 border 无任何实现、圆形裁剪需要文档未提及的 circle 参数(README 示例渲染出方图);addShape('circle') 忽略 width/height;日历 dimColor 有文档无实现
  • 二维码底部文案以左边缘为圆心(偏移约半个码宽)
  • 模板系统静默失败:未知元素类型被丢弃、坏 JSON 渲染白图、useTemplate() 吞掉手写元素
  • FileStorage 并发读改写竞态(40 并发 16 次坏读 → 真实用户答对也被判错)
  • 5 个配置键写在配置与文档中却从未被任何代码读取(如 captcha.default_difficulty)
  • 圆角/阴影在源分辨率上做整幅逐像素遮罩:3000×4000 图在默认 128M 下致命 OOM,且同一 radius 在不同源尺寸下形状差 32×
  • circle() 逐像素回写:rotate 验证码 710ms → 36ms,且「圆形头像」此前实为圆角方块

性能

项 前 后
rotate 验证码 710 ms 36 ms
circle(400) 347 ms 26 ms
圆角 3000×4000 致命 OOM 285 ms / 68 MB
blur(10) 2977 ms 101 ms
PNG 默认体积 3916 KB 2 KB
长文本换行测量 — 2.6~3.2× 更快

新增

  • 验证码 setTargetType('icon'):11 种程序化生成的矢量图形目标(无需图片素材),extra.texts 附带缩略图
  • 行为轨迹校验(可选)、PSR-16 缓存存储适配(鸭子类型,不引入依赖)、Laravel 图片端点 GET /captcha/{key} 与 captcha 验证规则
  • 海报:replaceElements(false) 在模板上叠加元素、PosterBuilder::toArray() 结构往返、ElementRegistry 元素单点注册、addPet()
  • save() 按扩展名推断格式;poster.jpeg_quality / poster.png_compression / image.quality 等配置真正生效

破坏性变更

  • AbstractElement::toArray() 现返回「短类型名 + 拍平选项」(原为 ['type' => FQCN, 'options' => [...]]),以便与模板结构往返一致
  • 超容量二维码载荷、非法水印间距、非法元素尺寸现在抛 InvalidArgumentException(此前分别是静默产出废码、挂死进程、抛 GD 原生错误)

其他

  • 包体积:删除 4 个零引用字体,39 MB → 9.3 MB
  • 文档:13 份 README(12 语言)+ 39 张本地化图表;图表统一由 scripts/i18n-diagrams.php 生成(含中文),并新增配置键 lint 测试防止「死配置」复发
  • 测试:360 → 515 用例(4707 断言);CI 覆盖 PHP 8.0–8.5

完整变更:v1.2.14...v1.3.0