El servidor Revisar las subidas
Revisar las subidas
beforeUpload), y cuando llegaron sus bytes y antes de que nadie lo vea (inspect). Lo rechazado en el segundo se quita del bucket.En esta página
Antes de que suba
Con lo que la página dice de él: nombre, tipo, tamaño y adónde va. Aún no se ha enviado nada.
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
},
});Un Refused se responde con su estado, código y mensaje; false es un 403. Se pregunta por cada archivo nuevo y cada versión nueva, no por las imágenes pequeñas que hace la página. El tipo y el tamaño son los que dice la página: para lo que de verdad son, inspect.
Cuando llegaron sus bytes
Se pregunta antes de guardar el archivo o la versión, con una lectura de los bytes del almacenamiento. Los dos almacenamientos del servidor pueden leer.
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()lee los primeros 4 KB. Rechaza un programa (un .exe, un binario de Linux o de Mac) salvo conprograms: true, y un archivo cuyos bytes no son los de su extensión: un PNG que no lo es, un .docx que no es un zip.onlylimita a algunos tipos.clamav()envía los bytes a clamd, un megabyte cada vez, con su comando INSTREAM. Un archivo mayor de lo que acepta clamd (25 MB si no se dice) se rechaza, no se deja pasar sin revisar.inspectAll(…)pregunta a varios en orden: el primero que rechaza, rechaza.
Un archivo sin revisar no entra. Cuando inspect lanza algo que no es un Refused (clamd caído, un tiempo agotado), la subida se rechaza con un 503 y se quitan sus bytes. La página lo dice, y la persona lo vuelve a subir.
ClamAV en el servidor
# 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/clamavUn inspect propio
Cualquier función: un escáner de tu proveedor, una regla propia sobre lo que se puede guardar.
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.`);
},Lo que lee la gente
| Código | Estado | Cuándo |
|---|---|---|
| upload-refused | 403 | beforeUpload devolvió false |
| program-refused | 422 | checkType: un programa |
| type-mismatch | 422 | checkType: los bytes no son los de la extensión |
| type-refused | 422 | checkType: un tipo fuera de only |
| virus-found | 422 | clamav: un virus, nombrado en el mensaje |
| refused-content | 422 | inspect devolvió false |
| not-scanned · not-inspected | 503 | clamav, o inspect, no pudo revisarlo |
El drive dice cada uno en el idioma de la persona, por su código.