API 网关 Returns 禁止发布带有 "https://" 的字符串
API Gateway Returns Forbidden when string with "https://" is Posted
我有一个 API 网关端点设置,它使用 Lambda 函数在 DynamoDB 中存储 URL。当我 POST 正文中包含此消息时
"videoURL": "www.youtube.com/watch?v=cgpvCVkrV6M"
端点工作正常。它 returns 200 并且 DynamoDB 记录已更新。但是,当我 POST 这个
"videoURL": "https://www.youtube.com/watch?v=cgpvCVkrV6M"
端点returns 403 禁止响应并且数据库记录未更新。
当我在 API 网关内部测试时,“https://”字符串被接受。
我还有一个 API 密钥、一个使用计划、一个客户端证书和启用 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...”)并保持规则启用。对于遇到此问题的任何其他人,您必须权衡每种方法的易用性和风险。
我有一个 API 网关端点设置,它使用 Lambda 函数在 DynamoDB 中存储 URL。当我 POST 正文中包含此消息时
"videoURL": "www.youtube.com/watch?v=cgpvCVkrV6M"
端点工作正常。它 returns 200 并且 DynamoDB 记录已更新。但是,当我 POST 这个
"videoURL": "https://www.youtube.com/watch?v=cgpvCVkrV6M"
端点returns 403 禁止响应并且数据库记录未更新。
当我在 API 网关内部测试时,“https://”字符串被接受。
我还有一个 API 密钥、一个使用计划、一个客户端证书和启用 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...”)并保持规则启用。对于遇到此问题的任何其他人,您必须权衡每种方法的易用性和风险。