Parent : [[INDEX-CYBERSECU]]
Anti-Pattern : Génération de tokens de téléchargement sans restriction
Description
Générer des liens de téléchargement directs avec des tokens sans rate limiting, sans expiration courte, sans limite de downloads, sans binding IP, et sans audit log. Cela permet le partage massif de liens, le scraping de fichiers, et la fuite de contenu protégé.
Exemple réel - Archive Ygg
// downloadController.js — Archive Ygg (AVEC FAILLES)
exports.generateLink = async (req, res) => {
const { torrentId, fileId } = req.body;
// Pas de rate limiting
// Pas de vérification de quota
const token = nanoid(32);
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24h (trop long)
await db.insert(
`INSERT INTO downloads (...) VALUES (?, ?, ?, ?, ?, ?, 0, NOW())`,
[uuidv4(), req.session.userId, torrentId, fileId, token, expiresAt]
);
// Expose le token complet dans le HTML
res.render('downloads/link', {
link: `${req.protocol}://${req.get('host')}/downloads/${token}`
});
};
// Route publique SANS protection
exports.download = async (req, res) => {
const { token } = req.params;
const download = await db.queryOne(
`SELECT d.*, f.path as file_path FROM downloads d
LEFT JOIN files f ON d.file_id = f.id
WHERE d.token = ?`, [token]
);
// Pas de rate limiting
// Pas de vérification IP
// Pas de limite de downloads
// Pas de watermark
res.download(filePath);
};
Conséquences
- Partage massif : Un lien partagé = accès illimité pendant 24h
- Scraping : Un attaquant génère des milliers de liens pour récupérer tous les fichiers
- Fuite de contenu : Les liens circulent sur des forums/discord
- Perte de revenus : Contenu payant accessible gratuitement
- DDoS par downloads : Téléchargements massifs depuis un seul token
Quand c'est acceptable
JAMAIS pour du contenu protégé. Acceptable uniquement pour des fichiers publics avec rate limiting.
Solution
Utiliser le pattern KNOW-PAT-058 — Tokens de téléchargement sécurisés avec :
- Rate limiting (max 10 générations/heure)
- Expiration courte (1-4h pour contenu sensible)
- Limite de downloads (max 3 par token)
- IP binding optionnel
- Watermarking
- Audit log complet
Références
- Archive Ygg :
01_SOURCE_CODE/02g_debrideur/controllers/downloadController.js - OWASP : Insecure Direct Object References