上传校验
我的上传表单是否接受该接受的,并拒绝其余的?
upload-validation 预设用一条命令为这个问题构建出整套真实测试文件,并在旁边放一个
manifest.json,说明你的系统应如何响应每个文件。以下所有内容都按此版本的默认值从程序中读取。
它通常能发现什么?
- 限制只在浏览器中生效,而不在服务器上
- SVG 或 HTML 文件被当成图片或纯文本,这是让脚本绕过表单的一种办法
- 只按扩展名检查而从不打开文件,于是名为 .jpg 的 PDF 蒙混过关
- 表单在查看大小之前就把整个请求体读进内存
- 名为 PHOTO.JPG 的上传被拒绝,而 photo.jpg 被接受,或者相反
- 含空格、括号或非 ASCII 字符的文件名被原样写入磁盘
集合里有什么?
使用默认值时,如 tfg preset show upload-validation 所报告的:
| 文件数 | 71 |
|---|---|
| 其配方中的 target 数 | 22 |
| 总大小 | 120 639 488 B |
| 格式 | html, jpg, pdf, png, svg, txt |
以及该集合的清单对你的系统有何预期:
| 预期 | 含义 | 文件数 |
|---|---|---|
accept | 你的系统应该接受这个文件。 | 56 |
reject | 你的系统应该拒绝这个文件。 | 10 |
unspecified | 取决于你的系统规则。由你决定,然后检查实际发生的是否符合你的本意。 | 5 |
你可以更改什么?
| 设置 | 接受 | 默认值 | 作用 |
|---|---|---|---|
--limit |
形如 2mb 的大小 | 10mb |
你的上传表单声明的大小限制。这个集合在限制两侧各取一步,若要覆盖任意距离的文件,请运行 size-boundaries 预设。 这个默认值是我们的占位值,不是你的系统的值。请传入你自己的值。 |
--allow |
以逗号分隔的格式 id | jpg,png,pdf |
你的表单应该接受哪些类型。每种类型都会变成该类型的真实文件,它们构成整个集合的阳性对照。 |
--deny |
以逗号分隔的扩展名 | svg,html,exe,sh |
你的表单应该拒绝哪些扩展名。此版本没有对应格式的扩展名,仍会得到一个同名文件,内容为纯文本。 |
--far-over |
10x, 2x, off | 2x |
那个超大文件超出限制多少。如果写入限制数倍大小的文件不值得占用磁盘,可以关闭。 |
--bulk |
0 - 10000 个文件 | 50 |
批量上传包含多少个文件。设为零则完全不包含这一组。 |
如何运行?
查看集合的开销、构建它,或取出它的配方来编辑:
tfg preset show upload-validation
tfg generate --preset upload-validation --limit 10mb --out ./upload-validation
tfg preset eject upload-validation > upload-validation.yaml
也可以在你自己的配方中基于它构建,放在测试旁边:
version: 1
extends: preset:upload-validation
with:
limit: 10mb