出于安全原因,我正在寻找一种阻止不良行为者反复在服务器上发送重复查询的方法,因为这可能会导致执行性能不佳和/或部署价格较高。
在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 );
}
......
来实现我们自己的缓存后端的链接,但是我不确定如何使用它来防止重复查询多次运行。
也许我不是从正确的角度看待整个问题,所以如果您有任何建议,那将有很大帮助。
谢谢
答案 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进行更深入的讨论,但是除了速率限制之外,您可能还需要研究以下措施:
graphql-depth-limit
graphql-validation-complexity
和graphql-cost-analysis
尽管这些工具不一定能解决您所提出的问题,但在您深入研究如何保护端点安全时,我仍然会考虑使用它们的组合。