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
相关产品推荐
相关产品推荐

