Flask 中如何安全地在路由间传递文件名以实现删除功能

夏浩酱_4042

夏浩酱_4042

2026-08-08

786人浏览

原创

Flask 中如何安全地在路由间传递文件名以实现删除功能

本文介绍在 Flask 应用中,如何通过 URL 路径参数将文件名从 /archive 页面安全、清晰地传递至 /delete 路由,避免表单字段命名冲突与数据丢失问题,并结合 Jinja2 模板提升代码可维护性。

本文介绍在 flask 应用中,如何通过 url 路径参数将文件名从 `/archive` 页面安全、清晰地传递至 `/delete` 路由,避免表单字段命名冲突与数据丢失问题,并结合 jinja2 模板提升代码可维护性。

在 Flask 开发中,直接拼接 HTML 字符串(如 output += "...<form>..."</form>)不仅难以维护,还容易引发 XSS 风险和逻辑错误——尤其当需要动态绑定按钮与对应文件时,使用 <input name="idx" value="Delete"> 会导致所有按钮提交相同的 name,后端无法区分点击的是哪一个文件。

推荐方案是:放弃手动拼接 HTML,改用 Flask 内置的 Jinja2 模板引擎,并通过 Flask 的变量路由(/delete/<filename></filename>)直接将文件名作为路径参数传递。这种方式语义清晰、无需额外表单字段、天然支持 URL 编码,且能规避 request.form 取值失败的风险。

以下是优化后的完整实现:

from flask import Flask, redirect, render_template_string, url_for
import os

app = Flask(__name__)

@app.route('/archive')
def archive():
    path = '/home/pi/Videos/'
    try:
        dir_list = sorted(os.listdir(path))
    except FileNotFoundError:
        dir_list = []

    return render_template_string('''


<meta charset="UTF-8"><title>Video Archive</title><div class="box">
        <div class="flex-box">
            {% if dir_list %}
                {% for file in dir_list %}
                <div style="background: black; padding: 8px; margin: 4px 0; color: white;">
                    {{ file }}
                    <form method="post" action="%7B%7B%20url_for('delete',%20filename=file)%20%7D%7D" style="display:inline;">
                        <button type="submit" class="btn" style="margin-left: 8px;">Delete</button>
                    </form>
                </div>
                {% endfor %}
            {% else %}
                <p>No videos found.</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5360" title="Skill Weave Chains — 技能链路由引擎"><img
														src="https://img.php.cn/upload/skill/000/000/081/179047814579604.jpg" alt="Skill Weave Chains — 技能链路由引擎" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill5360" title="Skill Weave Chains — 技能链路由引擎" class="overflowclass">Skill Weave Chains — 技能链路由引擎</a>
													<p class="overflowclass">开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill5360" title="Skill Weave Chains — 技能链路由引擎" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
            {% endif %}
        </div>
    </div>


''', dir_list=dir_list)

@app.post('/delete/<filename>')
def delete(filename):
    base_path = '/home/pi/Videos/'
    full_path = os.path.join(base_path, filename)

    # 安全校验:防止路径遍历攻击(如 filename="../../etc/passwd")
    if not os.path.abspath(full_path).startswith(os.path.abspath(base_path)):
        return "Invalid file path", 400

    try:
        if os.path.exists(full_path):
            os.remove(full_path)
        else:
            pass  # 文件已不存在,静默处理或记录日志
    except PermissionError:
        return "Permission denied", 403
    except Exception as e:
        return f"Error deleting {filename}: {str(e)}", 500

    return redirect(url_for('archive'))</filename>

✅ 关键改进说明:

  • 使用 @app.post('/delete/<filename>')</filename> 接收文件名作为路径参数,<...></...><...></...>
  • <button></button><input type="submit">

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

2024.06.27

3315

8

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

5004

10

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

2025.12.15

296

16

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

0

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

80

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

100

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架路由开发手册
Buffalo框架路由开发手册

共0课时 | 0人学习

Buffalo框架官方文档
Buffalo框架官方文档

共0课时 | 0人学习