Repository navigation
v1.3.0
安全
- 封堵验证码跨 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