CloudFlare JS 挑战打破了我的 SPA

CloudFlare JS challenge is breaking my SPA

提问人:poisedsquirrel 提问时间:1/24/2019 更新时间:6/20/2023 访问量:2553

问:

我有一个基于 React 的 SPA,它通过 S3 托管在一个子域上,react.mydomain.com......它与托管在另一个子域 VPS 上的 PHP REST API 进行通信,api.mydomain.com .CloudFlare 背后的 api.mydomain.com。该 Web 应用程序位于 CloudFront 后面,因为它位于 AWS 上。

我遇到了机器人直接向 API 发出的请求淹没我的 VPS 的问题,我想将 JS 质询功能与 CloudFlare 一起使用来缓解。

然而,似乎正在发生的事情是,用户能够加载 React Web 应用程序(它不在 CloudFlare 后面)。然后,提示 JS 质询的请求将立即失败并显示 503 响应,因为它是 AJAX 请求,并且与 Javascript 质询不兼容。

我想我可以通过捕获错误并重定向来处理这个问题。但是,如果我手动强制自己的浏览器导航到 api.mydomain.com URL,我将看到 CloudFlare 质询并通过它。但是,如果我随后导航回我的 react.mydomain.com SPA,则 OPTIONS 请求将失败,因为它无法附加告诉 CloudFlare 它已通过的 cookie。

我不明白如何调整我的基础设施,以便我可以利用使用 JS 挑战。目前,我只能使用速率限制,但我发现,当我变得严重到用户开始抱怨时,我仍然允许似乎 ~75% 或更多的不需要的机器人流量通过。

ReactJS Laravel 安全 CORS Cloudflare

评论

0赞 root 3/5/2021
我不了解 cloudflare,但我已经看到其他解决方案配置了机器人保护跟踪 cookie,以包括前端和 API 域的范围。为了解决主要问题,你需要让你的 JS 代码检测到挑战,执行它(例如使用 ),等待挑战完成,然后重新运行请求。eval()

答:

-1赞 9pfs 3/11/2021 #1

如果您有后端访问权限,则可以使用 NPM,并在检测到机器人时将其用作临时解决方案。process.kill(process.pid)

评论

0赞 9pfs 3/11/2021
它(巧合地)创建了一个 [网站] 关闭了人类很难绕过的连接错误,因此可以有效地阻止无头机器人。
-2赞 Mohamed Sharaf 4/28/2021 #2

我建议不要在 s3 中仅托管 spa 文件上传或附件到 s3

在 Ec2 上托管并通过安全组策略阻止所有访问 只允许 Cloudflare IP 的 此处列出的 https://www.cloudflare.com/ips/

您还可以使用 Amazon AWS Lambda 无服务器托管,而不是 s3 https://aws.amazon.com/lambda/?c=ser&sec=srv

评论

1赞 Yves Gurcan 4/28/2021
S3,尤其是前面有 CloudFront 的 S3,是托管单页应用程序的完美且可扩展的解决方案。在 EC2 上托管或使用 Lambda 是不够的。例如,EC2 上的单页应用程序仍必须使用 Node.js 服务或 Apache 服务器提供服务。Lambda 必须集成到 API Gateway 才能提供内容。对于 SPA 来说,这两种解决方案似乎都很笨拙,而 S3 则提供了一个简单的解决方案。用户遇到的问题似乎与用于应用程序的 AWS 服务无关。