防止生产环境 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,而所有 relationshipupload 字段的复杂度值被设为 10。

如果你不需要 GraphQL,建议通过在 Payload Config 中设置 graphQL.disable: true 来完全禁用它。如果你想再次启用 GraphQL,可以随时移除该属性或将其设置为 false。关闭后,Payload 将跳过从你的 collections 创建 schema 的过程,并且不会注册该路由。

恶意文件上传

Payload 不会在服务器上执行上传的文件,但根据你的设置,它可能被用来传输和存储潜在的危险文件。如果你的配置允许文件上传,就有可能存在恶意用户上传有害文件,然后这些文件被提供给其他用户的情况。请考虑以下方法来降低风险。

首先,当允许用户注册新账户时,启用电子邮件验证并添加其他防机器人服务。

检查文件上传 collections 上的 createupdate 访问权限是否按照你的应用需求进行了严格限制。考虑限制对用户上传文件的 read 访问权限,以及如何限制用户上传的文件在 Payload 之外被访问。

你还可以添加第三方库来在钩子中扫描文件,或者部署防病毒软件。