防止生产环境 API 滥用
简介
Payload 内置了符合安全最佳实践的功能,可以根据应用程序的具体需求进行配置。
限制登录失败次数
设置用户账户在被暂时锁定前允许的最大登录失败次数。在启用身份验证的 collections 上设置 maxLoginAttempts
参数,为用户设置一个合理但较低的数值。使用 lockTime
参数设置用户最后一次登录失败后必须等待的毫秒数,之后才能再次尝试。
最大深度限制
通过 depth
参数查询 collection 并自动包含相关文档会产生性能开销。此外,你的配置可能存在循环引用关系,这种情况下可能会无限循环地填充关联关系,直到服务器超时崩溃。你可以在 Payload Config 中设置 maxDepth
属性来防止任何潜在的深度相关问题。最大允许深度应尽可能小而不影响开发体验,默认值为 10
。
跨站请求伪造 (CSRF) 防护
CSRF 防护会验证每个 API 请求的真实性,防止来自其他站点的恶意操作利用已授权用户的身份。查看如何配置 CSRF 请参阅此处。
跨域资源共享 (CORS)
为了安全地支持 headless 操作,你需要配置允许访问 Payload API 的请求来源。查看如何设置 CORS 以及其他 Payload 配置选项请参阅此处
限制 GraphQL 复杂度
由于 GraphQL 赋予了在服务器控制之外编写查询的能力,恶意用户可能会编写极其复杂的查询来拖慢你的服务器。为了防止资源密集型的 GraphQL 请求,Payload 提供了一种指定复杂度限制的方法。这些限制基于为每个请求计算的复杂度分数。
任何计算得出过于昂贵的 GraphQL 请求都会被拒绝。在 Payload Config 的 graphQL
中,你可以将 maxComplexity
值设置为整数。作为参考,每个添加字段的默认复杂度值为 1,而所有 relationship
和 upload
字段的复杂度值被设为 10。
如果你不需要 GraphQL,建议通过在 Payload Config 中设置 graphQL.disable: true
来完全禁用它。如果你想再次启用 GraphQL,可以随时移除该属性或将其设置为 false
。关闭后,Payload 将跳过从你的 collections 创建 schema 的过程,并且不会注册该路由。
恶意文件上传
Payload 不会在服务器上执行上传的文件,但根据你的设置,它可能被用来传输和存储潜在的危险文件。如果你的配置允许文件上传,就有可能存在恶意用户上传有害文件,然后这些文件被提供给其他用户的情况。请考虑以下方法来降低风险。
首先,当允许用户注册新账户时,启用电子邮件验证并添加其他防机器人服务。
检查文件上传 collections 上的 create
和 update
访问权限是否按照你的应用需求进行了严格限制。考虑限制对用户上传文件的 read
访问权限,以及如何限制用户上传的文件在 Payload 之外被访问。