it-swarm.com.de

Ist es möglich, eine Datei zu erstellen, deren Downloadvorgang nie abgeschlossen wird?

Ist es möglich, eine Datei von Grund auf neu zu erstellen, sodass der Download beim Herunterladen über HTTP nie tatsächlich abgeschlossen wird? Ich spreche hier nicht von Zip BOMB.

Bei einigen Download-Programmen können Sie Streaming-Ereignisse herunterladen, sodass die endgültige Größe der Datei nicht bekannt ist. Ist es möglich, eine Datei zu erstellen, bei der die Download-Software die tatsächliche Dateigröße nicht "erraten" kann und weiterhin herunterlädt?

18
mahen23

Ja, es ist möglich. Sie müssen nur die Chunked-Transfer-Codierung verwenden. https://en.wikipedia.org/wiki/Chunked_transfer_encoding

Abhängig von der Konfiguration Ihres Servers können Sie möglicherweise einfach ein CGI-Skript erstellen, das stdout in einer Endlosschleife schreibt und löscht.

Es scheint nicht mit Lighttpd zu funktionieren, von dem ich glaube, dass es die gesamte Ausgabe des CGI-Skripts puffert, bevor es an den Client gesendet wird. Es könnte jedoch auf anderen Webservern funktionieren.

Beispiel:

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

gefolgt von einer unendlichen Wiederholung von "1e\r\nUh-oh, das wird niemals aufhören.\n"

29
Oskar Skog

Ja, einfach/dev/urandom an den Client streamen. Vielleicht müssen Sie zuerst den Dateikopf fälschen, damit der Client denkt, dass er das angeforderte Material herunterlädt, und danach einfach zufälligen Junk streamen.

Eine Idee dazu in Python:

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

Wenn die Ausgabe dynamisch von der Serversoftware generiert wird, kann ein Stream erstellt werden, der so lange fortgesetzt wird, bis Sie die Verbindung trennen. Wenn Sie jedoch buchstäblich eine Datei möchten, kann diese nicht unendlich groß sein.

Wenn Ihr Dateisystem jedoch spärliche Dateien unterstützt, können Sie eine Datei erstellen, die größer als das Speichermedium ist, und auf diese Weise eine Datei erstellen, deren Download so lange dauert, dass es nicht möglich ist, alles herunterzuladen.

Die maximale Dateigröße unterscheidet sich zwischen den Dateisystemen. Bei ext4 beträgt das Limit 16 TB. Auf tmpfs liegt das Limit bei 8EB. Hier einige Beispiele, wie solche Dateien erstellt werden könnten:

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

Vorsicht beim Ablegen solcher Dateien auf einem Webserver. Wenn die von Ihnen verwendete Serversoftware die Bandbreite nicht drosselt, kann ein böswilliger Client Ihr Netzwerk überlasten.

5
kasperd