【问题标题】:How to validate URL parameters in Flask如何在 Flask 中验证 URL 参数
【发布时间】:2017-10-05 14:13:45
【问题描述】:

这是我第一个使用 Flask 和 Python 的应用程序。

我正在使用以下 URL 格式从 Arduino 向 Pythonanywhere 服务器实例上运行的烧瓶应用程序发送 POST 请求。

有效的 POST 请求:3 个 URL 参数 http://voyagers.pythonanywhere.com/senddata?node=1234&lat=18.5580&lng=73.8075

我需要通过以某种形式验证 URL 来阻止请求进一步处理。我希望这可以保护我的应用免受未经身份验证的 POST 请求的影响。

这样说:任何超过 3 个 URL 参数 http://voyagers.pythonanywhere.com/senddata?node=324&lat=18.5580&lng=73.8075&a=c&a=d

如何在 Flask 中实现这一点?

另外建议,如果有任何更好的方法可以用来保护应用程序免受未经授权的请求。

【问题讨论】:

  • 您认为发出请求的授权与该请求中的查询参数数量之间有什么联系?
  • @jonrsharpe 授权在这里我的意思是,如果硬件设备(arduino 节点)发送包含超过 3 个 URL 参数的 POST 请求,就像我上面提到的那样。我不想处理这样的请求。多说些错误检查! (PS:请原谅不恰当的行话,应用程序开发的新手)
  • 你看过例如stackoverflow.com/q/29568540/3001761?验证输入与保护应用程序不同,因此不清楚您要实现的目标。如果您只是想检查查询参数字典中的唯一键是 nodelatlng您尝试过这样写吗?

标签: python url flask http-post pythonanywhere


【解决方案1】:

如果您愿意从 URL 参数(即 URL 中“?”符号之后的任何内容)切换到 路径参数(即Path HTTP 标头中的任何内容,或第一个“/”之后和“?”之前的 URL 部分)。

您的示例可能如下所示:

@app.route('/post/<int:node_id>/<float:lat>/<float:lng>', methods=['POST'])
def process_post_request(node_id, lat, lng):
    # do some work
    return your_result

然后您可以向 URL 发送请求,例如:http://example.com/post/1234/-11.45/21.34

您可以在此处找到更多相关信息:http://flask.pocoo.org/docs/0.12/quickstart/#variable-rules

为了确保访问安全,您可以在此处使用一些示例 sn-ps:http://flask.pocoo.org/snippets/category/authentication/

如果您只是玩玩,我建议您仅限制对 HTTPS 的访问并使用基本身份验证。您可以使用此处所述的简单装饰器来执行此操作:http://flask.pocoo.org/snippets/8/

您将在浏览器中收到提示,要求您输入用户名和密码,并且浏览器会在会话期间记住它。或者,您可以在 Authorization 标头中以 base64 编码形式设置用户名和密码:https://en.wikipedia.org/wiki/Basic_access_authentication

【讨论】:

  • 感谢 Grepe!以上是我将尝试的一种解决方案。在“?”之后可以使用参数完成类似的操作吗?在网址中?而不是将 URL 修改为 'node_id/lat/long' ?
  • @balaji 据我所知,flask 中没有内置 URL 参数验证。你必须自己写。 URL 参数几乎免费且易于更改和/或附加而不会破坏任何内容......这就是使用它们的原因,例如用于跟踪目的(尝试点击几乎所有横幅广告并查看您的网址)。
猜你喜欢
  • 2021-09-19
  • 2015-06-16
  • 1970-01-01
  • 2015-12-13
  • 2018-04-10
  • 2012-02-11
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多