Comment je l'ai construit
- Mon rôle
- Produit, design & développement
- Contexte
- Projet personnel
Le problème
[01]Envoyer un fichier à quelqu'un ne devrait demander ni compte, ni application, ni bataille avec la taille maximale des pièces jointes. Mais un formulaire d'envoi ouvert à tous, sans compte, attire les abus : des fichiers trop lourds, des programmes renommés en PDF, et un bouton d'envoi par e-mail que les spammeurs adoreraient utiliser.
Ce que j'ai construit
[02]Dropwave réduit le travail du visiteur à un geste : déposer un fichier, recevoir un lien. Derrière, le navigateur envoie le fichier directement dans un bucket S3 privé, l'API NestJS vérifie sa taille réelle, et une fonction Lambda lit les premiers octets de chaque fichier pour s'assurer qu'il est bien ce qu'il prétend être avant que le lien fonctionne. Les liens peuvent expirer après une heure, un jour, une semaine, 30 jours ou à la date de votre choix, et une tâche planifiée supprime les fichiers expirés.
Choix clés
[03]Les fichiers ne passent jamais par l'API
Le navigateur envoie le fichier directement dans S3 avec une URL présignée valable une minute. Une URL présignée ne peut pas limiter la taille du fichier : à la confirmation de l'envoi, l'API compare donc la taille réelle dans S3 avec celle annoncée, et supprime le fichier si elles diffèrent.
Une vérification impossible à tromper
Chaque nouveau fichier dans S3 déclenche une fonction Lambda qui lit ses 4 premiers Ko, détecte son vrai format et rejette les programmes et les fichiers qui se font passer pour un autre type. Elle renvoie son verdict par une requête signée en HMAC, refusée au-delà de cinq minutes, et appliquer deux fois le même verdict ne change rien, car S3 peut envoyer un même événement plusieurs fois.
Un partage par e-mail inutilisable pour le spam
Cinq adresses par envoi et cinq envois par tranche de dix minutes, limités sur la vraie IP du visiteur que transmet Cloudflare. Le lien de chaque e-mail vient de la configuration du serveur, jamais de la requête : personne ne peut glisser son propre lien dans un e-mail envoyé depuis le domaine.
Le résultat
- 3Services AWS : S3, Lambda et SES
- 10 MoPar fichier, vérifiés à nouveau une fois stockés
- 30 joursExpiration maximale d'un lien, s'il expire

