CloudFlare JS挑战打破了我的SPA

时间:2019-01-23 23:11:05

标签: reactjs laravel security cors cloudflare

我有一个基于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%或更多的有害机器人流量通过。

3 个答案:

答案 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 StructureAWS 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