如何保护无需登录即可访问的公开API端点?(ReactJS+AWS架构)
针对无需登录的「联系我们」API端点(SET2)的保护方案及优化思路
一、SET2端点的有效保护方案
1. 验证码验证
- 集成Google reCAPTCHA v3(无交互型)或v2(点击验证型),前端在提交表单时获取验证码响应令牌,随请求一起发送到Lambda。
- Lambda中调用验证码验证接口,校验令牌合法性及分数(v3的话分数低于阈值直接拒绝),通过后再处理存储逻辑。
- 也可以用AWS原生的Amazon CAPTCHA,与API Gateway集成更顺畅,无需依赖第三方服务。
2. 请求签名(基于AWS SigV4)
- 利用AWS Cognito的未认证用户身份池,让前端无需登录就能获取临时AWS凭证(Access Key/Secret Key/Session Token)。
- 前端使用AWS SDK的SigV4签名器,对请求的URL、参数、headers进行签名,然后发送到API Gateway。
- 在API Gateway中启用SigV4认证,只有签名合法的请求才能通过,完全避免Origin/Referrer伪造的问题,同时确保请求来自你的合法前端应用。
3. IP限流与频率控制
- 在API Gateway的Usage Plan中配置单IP的速率限制(比如每分钟最多5次请求)和并发限制,直接拦截批量恶意请求。
- 或者在Lambda中维护一个DynamoDB表,记录每个IP的请求时间和次数,若短时间内请求超过阈值(比如1分钟内10次),直接返回拒绝响应,同时设置过期时间自动清理旧记录。
4. 表单反机器人策略
- 添加蜜罐字段:在表单中加入一个隐藏的输入框(通过CSS设置
display: none),正常用户看不到不会填写,机器人会自动填充,后端检测到该字段有值就直接拒绝请求。 - 后端严格校验字段格式:比如邮箱格式、内容长度限制,过滤含恶意脚本(XSS)或SQL注入特征的内容,同时检查请求的
Content-Type是否为预期的application/json或multipart/form-data。
二、「联系我们」页面的实现优化思路
1. 合并API资源,简化架构
- 无需单独搭建一套API Gateway和Lambda(SET2),可以将联系表单的端点加入现有的SET1 API Gateway,通过API Gateway的资源级授权区分处理:
- 原SET1端点继续使用Lambda授权器验证Auth0的Bearer Token。
- 联系表单端点使用上述验证码+SigV4签名/限流的组合策略,实现差异化保护。
- 这样能减少AWS资源的重复创建,降低维护成本。
2. 异步处理表单提交
- 将表单提交请求先发送到AWS SQS队列,再由Lambda异步消费队列中的消息写入DynamoDB。
- 前端只需收到SQS的入队成功响应即可,无需等待数据库写入完成,提升用户体验;同时能缓冲突发的提交请求,避免Lambda因并发过高被限流。
3. 前端增强体验与防护
- 前端添加表单字段实时验证,减少无效请求发送到后端。
- 提交按钮添加状态控制(比如点击后禁用并显示加载中),防止用户重复提交。
内容的提问来源于stack exchange,提问作者vpv
相关产品推荐
相关产品推荐

