You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask下载路由验证失效:浏览器历史记录可绕过404下载文件

问题原因与验证方案

这其实是Chrome浏览器的本地缓存/本地下载文件机制在搞鬼,和你的Flask服务完全没关系!我来给你拆解清楚:

核心原因

  • 下载历史指向本地文件:当用户第一次成功下载过该文件后,Chrome会把文件保存到本地下载目录,同时下载历史里的条目本质上是指向本地文件的快捷方式,而不是实时请求服务器的URL。所以用户从下载历史点击时,浏览器直接读取本地已有的文件,根本不会向你的Flask服务器发送任何请求——这就是为什么终端没日志、服务停了还能下载的原因。
  • 你的404拦截只对新请求生效:你在路由里加的return '', 404确实能拦截从未下载过该文件、直接访问下载链接的请求,但对已经有本地文件副本的用户来说,浏览器根本不需要再找服务器要文件了。

验证方法

你可以通过以下几步验证这个逻辑:

  1. 查看本地缓存文件
    • 打开Chrome下载历史(快捷键Ctrl+J),找到对应下载条目,右键选择「在文件夹中显示」,你会看到本地确实存着这个文件的副本。
    • 删除这个本地文件后,再从下载历史点击链接,这时候浏览器才会向Flask服务器发请求,你就能在终端看到请求记录,并且得到404响应了。
  2. 验证服务停止后的差异
    • 保留本地文件,停止Flask服务,从下载历史点击链接,依然能正常打开文件;
    • 删除本地文件后再点击,就会提示无法访问(因为没了本地副本,又连不上服务器)。
  3. 验证新请求的拦截效果
    • 打开Chrome的无痕窗口(隐私模式),直接访问下载链接——因为无痕模式不会使用之前的缓存,这时候你会直接收到404响应,终端也会出现对应的请求日志。

附你提供的代码片段:

from werkzeug import secure_filename
@app.route('/packages/download/<filename>', methods=['GET'])
def DownloadPackages(filename):
    return '', 404 # User should not have downloaded file. But why he still be able to download from history in browser
    ConfigPath = 'PYTHON_PACKAGE'
    Path = os.path.abspath(app.config.get(ConfigPath))
    Path = os.path.join(Path,filename)
    return send_from_directory(Path, filename=secure_filename(filename))

内容的提问来源于stack exchange,提问作者Houy Narun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:52:34