我有一个基于React的SPA,它通过S3托管在一个子域react.mydomain.com ...上,它与托管在另一个子域api.mydomain.com的VPS上的PHP REST API通信。 api.mydomain.com位于CloudFlare之后。该Web应用程序位于AWS上,因此位于CloudFront后面。
我在直接向API提出请求时遇到了问题,这些问题直接导致API泛滥,我的VPS泛滥,我想将JS挑战功能与CloudFlare结合使用以减轻压力。
但是,似乎正在发生的事情是用户能够加载React Webapp(它不在CloudFlare之后)。然后,提示JS质询的请求将立即失败,并显示503响应,因为它是AJAX请求,并且与Javascript质询不兼容。
我认为我可以通过捕获错误并重定向来处理此问题。但是,如果我手动强制我自己的浏览器导航到api.mydomain.com URL,我将看到CloudFlare挑战并将其传递。但是,如果我随后导航回到我的react.mydomain.com SPA,则OPTIONS请求将失败,因为它无法附加告知CloudFlare已通过的cookie。
我不知道如何调整基础架构,以便可以利用JS挑战。目前,我只能使用速率限制,但是我发现,当我变得非常严重以至于用户开始抱怨时,我仍然允许大约75%或更多的有害机器人流量通过。
答案 0 :(得分:0)
如果您有后端访问权限,则可以在检测到机器人时使用 NPM 和 process.kill(process.pid)
作为临时解决方案。
答案 1 :(得分:-1)
我遇到了你的问题。您应该查看 AWS Egde Lambda 。您可能可以使用它来实现您想要的。
基本上,AWS Lambda edge允许您拦截和更改到达您的云平台网站的每个请求/响应。您可以在Cloudfront发行版中的每个单个请求/响应上使用nodejs,c#,python等创建一些函数。
据我了解,您目前在api中具有保护功能,但是您的网站仍在为所有人加载,因此您在ajax调用中遇到503错误。为什么您在网站上也没有使用此保护?
如果Cloudflare不对其进行验证,则加载您的网站内容可能没有意义,对吗?那么,如果您还在Cloudfront托管的网站中也实现了云票价保护呢?我非常确定您可以使用Lambda Egde做到这一点,但这需要阅读并理解lambda边缘事件和工作流程。
看看AWS Egde Lambda Design Structure和AWS Edge Lambda Function Examples
答案 2 :(得分:-2)
我建议不要在 s3 中托管 spa,只将文件上传或附件发送到 s3
托管在 Ec2 上并通过安全组策略阻止所有访问 只允许 Cloudflare IP 此处列出https://www.cloudflare.com/ips/
您还可以使用 Amazon AWS Lambda serverless 代替 s3 进行托管 https://aws.amazon.com/lambda/?c=ser&sec=srv