发布带有“https://”的字符串时,API 网关返回 Forbidden

Posted

技术标签:

【中文标题】发布带有“https://”的字符串时,API 网关返回 Forbidden【英文标题】:API Gateway Returns Forbidden when string with "https://" is Posted 【发布时间】:2020-11-19 21:47:49 【问题描述】:

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

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

端点工作正常。它返回 200 并更新 DynamoDB 记录。但是,当我发布这个

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

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

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

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

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

【问题讨论】:

“当我在 API Gateway 中进行测试时”是什么意思,这与您发出的其他请求有何不同?您还用“我有一个 API 网关端点设置”进行了描述,所以我不确定现在首先应该是什么。听起来,好像您的请求甚至可能无法到达实际的 API,但在此之前的某个地方已经被拒绝了。 在 API Gateway 控制台的 API 资源下,每个方法都有一个标有“TEST”的框。单击该标签会将您带到“方法测试”屏幕,您可以在其中填充消息的“请求正文”并将该消息发送到 API。 @CBroe,我同意这听起来确实像是请求在发送到 API 之前被拒绝了。也许它被 WAF 拒绝了。 @AmosLong,您可以为 api 网关启用 CloudWatch Logs。 aws.amazon.com/pt/premiumsupport/knowledge-center/…. 【参考方案1】:

问题出在我的 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...”)并保持启用规则。对于遇到此问题的其他人,您必须权衡每种方法的难易程度与风险。

【讨论】:

以上是关于发布带有“https://”的字符串时,API 网关返回 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url

将带有 GMT 的字符串转换为日期时间格式 - php [重复]

带有自定义图片的 Facebook API 发布链接

ElasticSearch Java Api -创建索引

带有开发人员门户内容的 Azure API 管理实例副本

带有 IE、XMLHttpRequest 和 ssl (https) 的 CORS