服务器 检查上传
检查上传
字节从浏览器直接传到存储桶,不经过服务器;服务器只在字节到达后才列出文件。因此有两个时机可以拒绝:分配地址之前(
beforeUpload),以及字节到达后、任何人看到之前(inspect)。在第二个时机被拒绝的内容会从存储桶中删除。本页内容
上传之前
依据页面提供的信息:名称、类型、大小和目标位置。此时还未发送任何内容。
import { Refused, createDriveHandler } from '@rebofiles/server';
createDriveHandler({
// …
beforeUpload: (upload) => {
if (upload.type.startsWith('video/')) throw new Refused(415, 'no-videos', 'Videos go to the media library.');
if (upload.parent === null && upload.purpose === 'file') return false; // nothing loose at the top
},
});Refused 会以其状态码、代码和消息返回;false 返回 403。每个新文件和新版本都会调用,页面生成的缩略图不会。类型和大小是页面声称的值:要检查真实内容,请用 inspect。
字节到达之后
在保存文件或版本之前调用,可读取存储中的字节。服务器的两种存储都支持读取。
import { checkType, clamav, createDriveHandler, inspectAll } from '@rebofiles/server';
createDriveHandler({
// …
// A program called photo.png, a PDF called .docx: refused. Then ClamAV, on its TCP socket.
inspect: inspectAll(checkType(), clamav({ host: '127.0.0.1', port: 3310 })),
});checkType()读取前 4 KB。默认拒绝程序(.exe、Linux 或 Mac 的二进制文件),除非设置programs: true;也拒绝字节与扩展名不符的文件,例如不是 PNG 的 PNG、不是 zip 的 .docx。only可限定允许的类型。clamav()通过 INSTREAM 命令把字节发送给 clamd,每次一兆字节。超过 clamd 可接收大小(默认 25 MB)的文件会被拒绝,而不是未经扫描就放行。inspectAll(…)按顺序调用多个检查:第一个拒绝即拒绝。
未经检查的文件不会被放行。 当 inspect 抛出的不是 Refused(clamd 停止、超时)时,上传以 503 被拒绝,字节被删除。页面会提示,用户可以重新上传。
服务器上的 ClamAV
# Ubuntu: the daemon, its signatures kept fresh, and a socket the server reaches
sudo apt install clamav-daemon
echo 'TCPSocket 3310' | sudo tee -a /etc/clamav/clamd.conf
echo 'TCPAddr 127.0.0.1' | sudo tee -a /etc/clamav/clamd.conf
sudo systemctl restart clamav-daemon
# Or in Docker
docker run -d -p 3310:3310 clamav/clamav自定义 inspect
任意函数:服务商的扫描器,或你自己关于可保存内容的规则。
inspect: async (upload, drive) => {
if (upload.purpose === 'rendition') return; // a smaller picture the page made
const head = await upload.read({ from: 0, to: 4100 });
const verdict = await myScanner(upload.key, head);
if (verdict === 'reject') throw new Refused(422, 'rejected', `${upload.name} was not kept.`);
},用户看到的内容
| 代码 | 状态 | 何时 |
|---|---|---|
| upload-refused | 403 | beforeUpload 返回 false |
| program-refused | 422 | checkType:是程序 |
| type-mismatch | 422 | checkType:字节与扩展名不符 |
| type-refused | 422 | checkType:类型不在 only 中 |
| virus-found | 422 | clamav:发现病毒,消息中给出名称 |
| refused-content | 422 | inspect 返回 false |
| not-scanned · not-inspected | 503 | clamav 或 inspect 无法检查 |
网盘会根据代码,用每个人的语言显示。