2017-09-22 1 views
1

リレーションを介してデータが通過するのを防ぐために、どのように関係者間で認証を行っていますか?context.userリゾルバが既に設定されている場合でも、GraphQLリレーションはデータを漏洩します。リレーションシップによるデータエクスポージャーの防止方法

たとえば、ユーザーがいるショップがあります。

// Returns error as i've set custom resolver to allow only context.user.is_shop_owner 
{ 
    shops { 
    name 
    users { 
     email 
     ... 
    } 
    } 
} 

このクエリは、通常context.user.is_shop_ownerのようなカスタムリゾルバでブロックされているので、あなたは、ルートクエリからこれを実行することはできません。

ただし、悪意のあるユーザーがリレーションを通過してユーザーオブジェクトに到達した場合、ユーザーは機密ユーザーデータを取得できます。

// Data exposed un-intendedly due to relation traversal. How to prevent this? 
{ 
    products { 
    name 
    price 
    shop { 
     users { ... } // boom, exposed 
    } 
    } 
} 

これはgraphqlの欠陥ですか? あなたはどうやってこれを回避していますか

これはpython-grapheneスタックbtwにあります。

編集:Btw、私たちはexclude_fieldsをやることができると知っていますが、ShopNodeからユーザーにアクセスすることはできません。これはShopNodeを照会する重要な情報ですので、フィールドを限定するのは良い考えではないでしょう。

+0

この場合、Djangoを使用していますか?返品時にあなたの意見を表示できますか? –

+0

@MauricioCortazar私はDjangoビューを使用していません、ごめんなさい! –

+0

スキーマ*私は* –

答えて

0

context.userに基づいてアクセスを制限するリレーションをブロックするために、各ノードのカスタムリゾルバを設定しました。上の私の質問に応じて、下のコードを参照してください。

class ProductNode(DjangoObjectType): 
    class Meta: 
     model = Product 
     interfaces = (graphene.relay.Node) 
     # Exclude nodes where you do not need any access at all 
     exclude_fields = ['users'] 

    # For nodes where you need specific/limited access, define custom resolvers. 
    # This prevents the relation traversal loophole 
    def resolve_shop(self, args, context, info): 
     """ Allow access to nodes only for staff or shop owner and manager """ 
     if get_is_staff_user(context.user, self): 
      return self.shop 

     Operations.raise_forbidden_access_error() 
2

ユーザーが適切な権限を持っていない場合はnullを返すように、これはおそらくShopタイプで制御する必要があります。そうでない場合は、Shopに2番目のフィールドからアクセスした場合は、チェックを複製する必要があります。

+0

をどのように実装するのですか? – Blusky

関連する問題