我有一个基于React的SPA,它通过S3托管在一个子域上,react.mydomain.com...它与托管在另一个子域上的VPS上的PHP REST API通信,api.mydomain.com。api.mydomain.com在CloudFlare后面。WebApp位于CloudFront的后面,因为它位于AWS上。
我有问题w/ bot请求直接到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%或更多的不需要的bot流量通过。
3条答案
按热度按时间wtzytmuj1#
您当前的基础架构设置似乎面临着一个复杂的问题。让我们把它分解并讨论可能的解决方案。
一种选择是创建一个单独的子域,如
protectedapi.mydomain.com
,并将其配置为使用启用JavaScript挑战的CloudFlare。这个子域名将作为您的API请求的代理。然后,您的React Web应用程序可以向protectedapi.mydomain.com
发送请求,protectedapi.mydomain.com
将处理JavaScript挑战并将请求转发给api.mydomain.com
。通过这种方式,API请求通过挑战,同时保持您的Web应用不受影响。api.mydomain.com
上成功通过JavaScript挑战后,您后续的OPTIONS请求会失败,因为它们不包含指示成功挑战的必要cookie。要解决这个问题,您可以配置CloudFlare在JavaScript质询通过时发出会话cookie。通过启用CloudFlare Jmeter 板中“防火墙>设置>安全级别”下的“Cookie”选项,将在成功完成JavaScript挑战时发出Cookie。此cookie将自动附加到后续请求,允许OPTIONS请求成功通过。
此外,请确保您的CORS(跨域资源共享)配置允许在OPTIONS请求中包含必要的标头和Cookie。
请记住监控您的系统并根据需要调整安全措施,以在防止不必要的机器人流量和保持流畅的用户体验之间取得平衡。
edqdpe6u2#
如果您有后端访问权限,您可以在检测到bot时使用NPM和
process.kill(process.pid)
作为临时解决方案。mi7gmzs63#
我建议不要在s3中托管spa,只上传文件或附件到s3
主机在Ec2上并通过安全组策略阻止所有访问仅允许此处列出的Cloudflare IP https://www.cloudflare.com/ips/
您还可以使用Amazon AWS Lambda无服务器来进行托管,而不是s3 https://aws.amazon.com/lambda/?c=ser&sec=srv