防止在Apollo Server 2中重复查询

时间:2018-11-01 12:43:44

标签: security graphql apollo-server

出于安全原因,我正在寻找一种阻止不良行为者反复在服务器上发送重复查询的方法,因为这可能会导致执行性能不佳和/或部署价格较高。

Apollo Server Documentation中,有一个指向如何使用public class PropertyListAdapter extends BaseAdapter { ...... @Override public Object getItem( int position ) { if ( mPositionType[ position ] == DisplayType.Properties ) { return getPropertyForPosition( position - mSectionPositionAdjustment[ DisplayType.Properties.ordinal() ] ); } return mPositionType[ position ]; } @Override public long getItemId( int position ) { return position; } @Override public View getView( int position, View convertView, ViewGroup parent ) { return getDisplayView( position, convertView, parent ); } ...... 来实现我们自己的缓存后端的链接,但是我不确定如何使用它来防止重复查询多次运行。

也许我不是从正确的角度看待整个问题,所以如果您有任何建议,那将有很大帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是实现某种速率限制中间件。使用express-rate-limit

的简单示例
const server = new ApolloServer({ typeDefs, resolvers })
const app = express()

const limitMiddleware = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100,
})

app.use(limitMiddleware)
server.applyMiddleware({ app })

app.listen({ port: 4000 })

默认情况下,中间件禁用请求IP,但是如果您希望获得更详细的信息并禁用IP和查询字段名称(例如),则可以使用graphql-tag解析请求主体并相应地生成密钥。

GraphQL在安全性方面提出了一些独特的挑战。您可以查看this article进行更深入的讨论,但是除了速率限制之外,您可能还需要研究以下措施:

  1. 数量限制-使用存储级别的限制,使用自定义标量或在解析器内部实施检查,以防止一次返回太多“事物”
  2. 查询深度限制-graphql-depth-limit
  3. 限制一般查询的复杂性和成本-graphql-validation-complexitygraphql-cost-analysis

尽管这些工具不一定能解决您所提出的问题,但在您深入研究如何保护端点安全时,我仍然会考虑使用它们的组合。