web-dev-qa-db-fra.com

Est-il possible de créer un fichier qui ne termine jamais son processus de téléchargement?

Est-il possible de créer un fichier à partir de zéro que lorsqu'il est téléchargé via HTTP, le téléchargement ne se termine jamais réellement? Je ne parle pas ici de Zip BOMB.

Certains logiciels de téléchargement vous permettent de télécharger des événements en streaming, la taille finale du fichier n'est donc pas connue. Est-il possible de créer un fichier où le logiciel de téléchargement n'est pas en mesure de "deviner" la taille réelle du fichier et continue de télécharger?

18
mahen23

Oui c'est possible. Vous avez juste besoin d'utiliser l'encodage de transfert en morceaux. https://en.wikipedia.org/wiki/Chunked_transfer_encoding

Selon la configuration de votre serveur, vous pourrez peut-être simplement créer un script CGI qui écrit et vide la sortie standard dans une boucle infinie.

Il ne semble pas fonctionner sur Lighttpd qui, je crois, met en mémoire tampon la sortie entière du script CGI avant de l'envoyer au client. Cela pourrait fonctionner sur d'autres serveurs Web.

Exemple:

HTTP/1.1 200 OK\r\n
Transfer-Encoding: chunked\r\n
Content-Type: text/plain\r\n
\r\n
1e\r\n
Uh-oh, this will never stop.\n
1e\r\n
Uh-oh, this will never stop.\n

suivi d'une répétition infinie de "1e\r\nUh-oh, cela ne s'arrêtera jamais.\n"

29
Oskar Skog

Oui, diffusez simplement/dev/urandom sur le client. Tout d'abord, vous devrez peut-être falsifier l'en-tête du fichier, afin que le client pense qu'il télécharge les éléments qu'il a demandés, et après cela, diffusez simplement des fichiers indésirables.

Une idée sur la façon de faire cela en Python:

with open("/dev/random", 'rb') as f:
    print repr(f.read(10))
15
r00m

Si la sortie est générée dynamiquement par le logiciel serveur, il est possible de créer un flux qui continue jusqu'à ce que vous interrompiez la connexion. Cependant, si vous voulez littéralement un fichier, il ne peut pas être de taille infinie.

Cependant, si votre système de fichiers prend en charge des fichiers clairsemés, vous pouvez créer un fichier plus volumineux que le support de stockage et ainsi produire un fichier qui prendrait tellement de temps à télécharger qu'il n'est pas possible de tout télécharger.

La taille de fichier maximale diffère selon les systèmes de fichiers. Sur ext4, la limite est de 16 To. Sur tmpfs, la limite est de 8EB. Voici quelques exemples sur la façon dont ces fichiers peuvent être créés:

dd if=/dev/null of=/dev/shm/sparse bs=1 seek=7E
dd if=/dev/null of=/tmp/sparse bs=1 seek=15T

Méfiez-vous lorsque vous placez de tels fichiers sur un serveur Web. Si le logiciel serveur que vous utilisez ne limite pas la bande passante, il est possible qu'un client malveillant surcharge votre réseau.

5
kasperd