我有一个网站,人们可以在其中填写新闻源的 url。然后,我的服务器将下载该新闻源并对其进行解析。我如何保护自己免受太大的新闻提要?
太大我的意思是:太大以至于下载需要太多时间、带宽或文件空间。我可以对接收的 MB 数量设置限制吗?或者限制下载时间?
我知道的每个 http 客户端库(至少在 Python 中)都会给你或者可以给你一个流:
>>> import requests
>>> r = requests.get('https://example.com/big-file', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
现在您有可用的响应标头,可能存在 Content-Length:
>>> r.headers.get("content-length")
'33236'
如何从流中读取取决于您:
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
如果我想通过最大时间和最大大小来限制下载,我会这样做:
t0 = time.time()
total_size = 0
while True:
if time.time() - t0 > time_limit:
raise Exception("Too much time taken")
if total_size > size_limit:
raise Exception("Too large")
data = r.raw.read(8192)
if data == "":
break # end of file
total_size += len(data)
output_file.write(data)
当您过早退出 HTTP 连接时,Web 服务器不会停止工作 :)