amazon-web-services - 当发布带有 "https://"的字符串时,API 网关返回 Forbidden

标签 amazon-web-services aws-api-gateway

我有一个 API Gateway 端点设置,它使用 Lambda 函数在 DynamoDB 中存储 URL。当我发布正文中包含此内容的消息时

"videoURL": "www.youtube.com/watch?v=cgpvCVkrV6M"

端点工作正常。它返回 200 并且 DynamoDB 记录已更新。但是,当我发布此内容时

"videoURL": "https://www.youtube.com/watch?v=cgpvCVkrV6M"

端点返回 403 Forbidden 响应,数据库记录未更新。

当我在 API Gateway 内测试时,接受“https://”字符串。

我还有 API key 、使用计划、客户端证书和启用 CORS(用于本地测试)。我认为这些都不是造成我的问题的原因。

有人猜测为什么“https://”字符串会导致问题吗?

最佳答案

问题出在我的 Web 应用程序防火墙 (WAF) 中。创建防火墙时,我添加了 AWS-AWSManagedRulesCommonRuleSet 集合。根据documentation of this rule set ,规则之一是:

GenericRFI_BODY - Inspects the values of the request body and blocks requests attempting to exploit RFI (Remote File Inclusion) in web applications. Examples include patterns like ://.

禁用此规则解决了我的问题。我现在可以成功发送“https://”并将其存储在我的数据库中。

但是,此规则代表了最佳实践(或至少是良好实践),不应在不考虑风险的情况下禁用。通过禁用此规则,我使我的端点容易受到远程文件包含攻击。由于我可以访问端点和 Lambda 函数定义,因此我可以将 URL 输入拆分为两个字段(“https”和“www.youtube...”)并保持规则启用。对于遇到此问题的其他人,您必须权衡每种方法的难易程度与风险。

关于amazon-web-services - 当发布带有 "https://"的字符串时,API 网关返回 Forbidden,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64920512/

相关文章:

ruby-on-rails - AWS Cognito + RubyOnRails 在后端获取用户信息。 Aws::CognitoIdentityProvider::Errors::NotAuthorizedException

amazon-web-services - AWS::AutoScaling::LaunchConfiguration 您无权执行此操作

node.js - API Gateway 排序查询字符串

amazon-web-services - 如何在 AWS 中启用 swagger UI

amazon-web-services - 将无效请求发布到Amazon CloudFront时,CallerReference是什么?

php - 具有 Elastic Beanstalk 的 Amazon SQS 服务

amazon-web-services - 如何通过 IP 限制 AWS Lambda 或 API Gateway?

aws-lambda - AWS Amplify 如何包含跨两个模型属性的验证? (例如开始日期 < 结束日期)

python-3.x - 将文件上传到 AWS Device Farm

amazon-web-services - 使用无服务器框架请求验证