Python烧瓶和石墨烯:错误的请求会导致安全问题

时间:2018-11-09 21:08:35

标签: flask graphql flask-login graphene-python flask-graphql

我正在一个简单的消息传递系统上,其中两个不同的用户可以互相发送消息。现在,每个用户都使用graphQL轮询请求最新消息的服务器。

问题是,当一个用户(用户A)发送大量消息(graphQL突变查询)而另一用户(用户B)进行轮询时,消息有时似乎是由用户B发送的。

我更深入地研究,发现在错误分配消息的情况下,突变查询是用不正确的请求(在上下文中填充)命中的,而current_user中的flask_login是也错了。 current_user似乎取决于请求。该请求是用户B的轮询请求之一(不是突变)。

我追溯了一下,找到了填充上下文的地方(https://github.com/graphql-python/flask-graphql/blob/master/flask_graphql/graphqlview.py#L42),但是很难弄清楚为什么它从Flask那里收到了不正确的请求。

我最好的猜测是Flask的请求上下文堆栈正在发生某些事情,但是很难追踪。

我应该提及的是,身份验证是使用Authorization标头完成的,并且我试图找出一种情况,即用户被错误身份验证但无法被身份验证。

这似乎仅在我直接使用FLASK_ENV=production flask run运行flask时发生,而当我使用gunicorn运行烧瓶时似乎消失了。即便如此,令人担忧的是身份验证可能如此脆弱。

以前有没有人看过这个问题?在Flask文档中是否有什么可以解释此问题,为什么会发生,更重要的是,当我使用gunicorn时为什么不会发生?

相关代码版本:

  • 烧瓶1.0.2
  • Flask-GraphQL 2.0.0
  • Flask登录0.4.1
  • Flask-SQLAlchemy 2.3.2
  • 石墨烯2.1.3
  • graphene-sqlalchemy 2.1.0
  • graphql-core 2.1
  • SQLAlchemy 1.2.12

示例代码:

import graphene as gr
from graphql import GraphQLError
from flask_login import current_user

from ...models import Message
from .shared import MessageNode

class CreateMessage(gr.Mutation):
    """ Send a message to a channel account """

    message = gr.Field(MessageNode)

    class Arguments:
        body = gr.JSONString(required=True)

    @login_required
    def mutate(self, info, body):
        # Make sure that the body is populated with something
        if not (body.get("text") and not body.get("image")) and not (
            not body.get("text") and body.get("image")
        ):
            raise GraphQLError("Body must contain either text or an image")

        new_message = Message(
            body=body,
            sender_account=current_user, # CURRENT USER IS INCORRECT HERE
        )
        db.session.add(new_message)
        db.session.commit()
        return CreateMessage(message=new_message)

0 个答案:

没有答案