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

Flask请求路径含%25时被篡改的技术咨询

关于Flask处理含%25路径的问题解答

问题1:%25是否确实不允许出现在请求路径中?

不是。%25是%字符的URL编码形式,HTTP规范允许URL路径中包含经过正确编码的保留字符。问题的核心在于URL编码的层级逻辑:

  • 若要在路径中表示原始字符串%25,必须对其进行二次编码,最终形式为%2525(因为单个%需编码为%25,所以%25整体编码就是%25+25)。
  • 你当前请求中的test %25a.txt,客户端会自动将空格编码为%20、%编码为%25,最终路径变为test%20%25a.txt——这实际是原始字符串test %a.txt的编码结果,而非test %25a.txt的正确编码。
    Flask底层的Werkzeug库会自动对收到的URL路径做一次解码,所以request.base_url显示的是解码后再重新编码的内容,这属于符合HTTP标准的正常处理逻辑。

问题2:允许文件名包含%25的应用的处理方式

1. 规范客户端编码逻辑

要求客户端传递含%25的文件名时,必须做完整的URL编码:

  • 原始文件名:test %25a.txt
  • 正确编码后路径片段:test%20%2525a.txt

2. 服务端获取原始未解码路径

若无法修改客户端行为,可从WSGI环境变量中直接获取未被Werkzeug解码的原始请求路径:

from flask import request

@app.route('/Files/<path:filepath>')
def handle_file(filepath):
    # 获取原始请求路径
    raw_request_path = request.environ.get('RAW_URI')
    # 或通过url_parse获取原始路径
    from werkzeug.urls import url_parse
    parsed_url = url_parse(request.url)
    raw_path = parsed_url.path
    # 自行处理解码逻辑
    return f"原始路径: {raw_path}"

注:不同WSGI服务器(如Gunicorn、uWSGI)对RAW_URI的支持可能存在差异,需测试验证。

3. 自定义路由解码规则

通过Flask的url_value_preprocessor钩子,自定义路径解码逻辑,绕过默认的自动解码:

from flask import Flask
from urllib.parse import unquote

app = Flask(__name__)

@app.url_value_preprocessor
def custom_path_decoder(endpoint, values):
    if values and 'filepath' in values:
        # 自定义解码,比如保留原始编码或手动处理
        values['filepath'] = unquote(values['filepath'], errors='replace')

@app.route('/Files/<path:filepath>')
def handle_file(filepath):
    return f"处理后的文件路径: {filepath}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45