带 % 的 Flask URL 参数未正确处理

2024-05-07

EDIT2:对于缺乏清晰度,我深表歉意。 我将提供几个值。第一个是我使用前端应用程序调用的 URL。第二个是调用前的值urllib.unquote。第三个是调用后的值urlib.unquote.

前端:

console.log('http://localhost:8080/v1/' + encodeURIComponent(name))

backend:

def f(param=''):
    print('*', param)
    param = urllib.unquote(param)
    print('**', param)

Ex.

http://localhost:8080/v1/https%3A%2F%2Fgoogle.com
* https:%2F%2Fgoogle.com
** https://google.com

Ex2.

http://localhost:8080/v1/foo%2520bar
* foo%20bar
** foo bar

Ex3.

http://localhost:8080/v1/foo%20bar
* foo bar
** foo bar

感谢您对此的耐心和帮助。对于我原来的帖子中不清楚的地方,我深表歉意。

编辑:简而言之,如果我打电话/v1/%2520,参数等于" "在函数末尾,而不是"%20",在函数的开头它等于"%20"并不是"%2520".

我目前正在使用 Python 2.7 开发 Flask 应用程序。

我正在尝试创建一个可以处理 URL 参数的函数。

@app.route('/v1/<param>', methods=['DELETE'])
def f(param=''):
    param = urllib.unquote(param)

在我的前端应用程序中,我通过编码来调用此函数param。但是,如果我通过"foo bar" and "foo%20bar"对于函数来说,param被解析为相同的值——"foo bar",当真的"foo bar"应该"foo bar" and "foo%20bar"应该"foo%20bar".

由于这个错误,我无法删除"foo%20bar"入口。如果我尝试删除它,它就会删除"foo bar",还有一次"foo bar"被删除时,"foo%20bar"条目永远不会被删除。

我相信这是因为"%20"不等于"%2520"即使这就是参数。当我在调用之前打印这个值时urllib.unquote(param)它已经等于"%20"。然后,当我打电话时urllib.unquote(param)该值更改为" ".

我不太确定这是否是 Flask/Werkzeug 中的错误,但它导致我的应用程序无法工作。

您对解决这个问题有什么建议吗?谢谢!


不,Flask 通常处理百分比编码非常正确。 URL 中的参数采用百分比编码,并且在设置 WSGI 环境时为您进行解码。然后 Flask 在匹配时将其传递给您的路线。

You do not需要再次解码参数值,删除你的urllib.unquote() call.

您的浏览器实际上会将 URL 中的空格编码为%20对于您来说,即使地址栏会显示一个空格。地址栏对百分比编码的组件进行解码,以便可以读取国际字符(因此%E3%81%A9%E3%81%86%E3%82%82%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86显示为どうもありがとう, 例如)。

如果您遇到编码斜杠问题(/, %2F),然后看问题#900 https://github.com/pallets/flask/issues/900,需要考虑 Apache 指令(和其他 WSGI 服务器)的边缘情况。你需要使用一个<path:param>组件来匹配那些,因为默认string参数类型将不匹配斜杠。

如果我使用以下测试脚本,名为routetest.py:

from flask import Flask
try:
    from urllib.parse import unquote  # PY3
except ImportError:
    from urllib import unquote  # PY2

app = Flask(__name__)

@app.route('/v1/<path:param>')  # NOTE: <path:param> is required to match /
def f(param=''):
    return (
        f"param: {param}\ndecoded param: {unquote(param)}\n",
        200,
        {'content-type': 'text/plain'}
    )

use FLASK_APP=routetest flask run启动此脚本localhost:5000,那么我无法重现您的问题:

$ curl http://localhost:5000/v1/https%3A%2F%2Fgoogle.com
param: https://google.com
decoded param: https://google.com
$ curl http://localhost:5000/v1/foo%2520bar
param: foo%20bar
decoded param: foo bar
$ curl http://localhost:5000/v1/foo%20bar
param: foo bar
decoded param: foo bar

这只能意味着您的 WSGI 服务器错误地处理了路径中的引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带 % 的 Flask URL 参数未正确处理 的相关文章

随机推荐