是否可以创建一个永远不会完成下载过程的文件?

信息安全 http
2021-08-25 19:47:50

是否可以从头开始构建一个文件,当它通过 HTTP 下载时,下载实际上从未完成?我不是在这里谈论 ZIP BOMB。

一些下载软件允许您下载流媒体事件,因此文件的最终大小是未知的。是否可以制作一个下载软件无法“猜测”实际文件大小并继续下载的文件?

3个回答

对的,这是可能的。您只需要使用分块传输编码。 https://en.wikipedia.org/wiki/Chunked_transfer_encoding

根据您的服务器配置,您也许可以简单地创建一个 CGI 脚本,在无限循环中写入和刷新标准输出。

它似乎不适用于 Lighttpd,我相信它会在将 CGI 脚本的整个输出发送到客户端之前对其进行缓冲。不过,它可能适用于其他网络服务器。

例子:

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

然后无限重复“1e\r\nUh-oh, this will never stop.\n”

是的,只需将 /dev/urandom 流式传输到客户端。首先,也许您需要伪造文件头,以便客户端认为它正在下载它请求的内容,然后只是流式传输随机垃圾。

关于如何在 Python 中执行此操作的想法:

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

如果输出是由服务器软件动态生成的,则可以创建一个一直持续到断开连接的流。但是,如果您确实想要一个文件,则它的大小不能无限大。

但是,如果您的文件系统支持稀疏文件,您可以创建一个比存储介质大的文件,这样会生成一个需要很长时间才能下载的文件,以至于无法全部下载。

文件系统之间的最大文件大小不同。在 ext4 上,限制为 16TB。在 tmpfs 上,限制为 8EB。以下是一些关于如何创建此类文件的示例:

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

将此类文件放在网络服务器上时要小心。如果您使用的服务器软件不限制带宽,则恶意客户端可能会使您的网络过载。