fle*_*ive 33 rest caching ddos cloudflare single-page-application
我正在设计一个RESTful API,旨在供单页应用程序和本机移动应用程序使用.此API的某些调用会返回可以缓存一段时间的公开结果.此外,需要速率保护来保护API免受未经授权的用户(蜘蛛)
缓存: Cloudflare 支持HTTP缓存控制头,因此API可以决定通过GET请求的每个实体是否公开以及缓存多长时间.
DDOS保护: Cloudflare支持有一篇文章建议对后端API禁用DDOS保护,但这不适用于我的用例,即每个客户端应该向API发出少量请求.本机DDOS保护实际上符合我保护API免受机器人攻击的要求.
我需要知道如何以编程方式检测Cloudflare何时服务于Captcha/我受到攻击等页面这将允许SPA /移动应用程序智能地做出反应,并将用户重定向到Web视图,在那里她可以演示她" hummanness".
从Cloudflare文档中,显示DDOS质询时发送的HTTP状态代码并不明显.绕过Cloudflare DDOS保护的开源云计算器似乎表明Captcha和挑战页面的HTTP状态为200. 有没有比解析请求体更好的方法来确定是否启动了DDOS保护?
Cloudflare 显然使用cookie记录谁成功解决了Captcha.这显然会增加本机应用程序的额外复杂性.在挑战解决后,有没有一种方法可以将Cloudflare会话cookie转移回本机应用程序?
可能这是一个先进的Cloudflare用例 - 但我认为它很有前途,并且很高兴听到有人有这样的经历(在Cloudflare或其他CDN上).
这是 @flexresponsive 提出的一个 5 年前的问题,最新的答案是 3 年前写的,2 年前评论过的。虽然我确信 OP 现已找到解决方案,无论是在 CloudFlare 内还是其他地方,我将以现代(2020)方式更新给出的解决方案,并保留在 CloudFlare 内。详细的页面规则对任何人来说总是一个好主意;然而,对于 OP 的特定需求,这个特定的集合与“CloudFlare Workers”脚本相结合将是有益的:
Edge Cache TTL: (n)time设置为 CloudFlare 沿其“边缘”缓存 API 内容所需的时间(从边缘节点/服务器场位置出发的路由取决于用户的帐户计划,“免费”优先级最低,因此更有可能提供内容从延迟较高的位置到您的消费者。
但是Edge Cache TTL> 0(基本上根本不使用它)这将不允许设置以下内容,这对您的 API 可能重要也可能不重要:
Cache Deception Armor:ON
Origin Cache Control:ON 如果正在使用 #3 并且您想要执行以下操作:
使用Cache Level:Cache Everything与在调用 API 期间运行的工作程序结合使用。紧扣主题,我将展示两个特定于您的 API 路由/地址使用的标头。
addEventListener("fetch", event => {
event.respondWith(fetchAndReplace(event.request));
});
async function fetchAndReplace(request) {
const response = await fetch(request);
let type = response.headers.get("Content-Type") || "";
if (!type.startsWith("application/*")) {
return response;
}
let newHeaders = new Headers(response.headers);
'Cache-Control', 's-maxage=86400';
'Clear-Site-Data', '"cache"';
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
}
Run Code Online (Sandbox Code Playgroud)
在设置两个特定于缓存的标头时,您是在说“只有共享代理可以缓存此标头”。不过,不可能完全控制任何共享代理的实际行为,因此根据 API 有效负载,no-transform如果这是一个问题,则该值可能很有价值,例如,如果仅使用 JSON,那么没有它就可以了,除非行为不当的缓存决定一路破坏它,但如果说,您将提供任何需要完整性哈希或随机数的东西,那么必须使用它来no-transform确保有效负载根本不被改变,并且在被改变时不能被改变已验证为来自您的 API 的文件。带有 Cache 值设置的 Clear-Site-Data 标头指示消费者的浏览器在接收有效负载时基本上清理缓存。“Cache”需要在 HTTP 标头中用双引号括起来才能发挥作用。
只要运行检查以确保您的消费者不会遇到阻塞情况,即 API 有效负载无法直接传输给他们并且 hCaptcha 启动,检查包含字符串的查询字符串的最终目的地cf(我不记得确切的布局,但它肯定会有 CloudFlare cf,并且绝对不是您希望消费者登陆的地方。除此之外,CloudFlare 使用的“正常”DDoS 保护不会通过与 API 的正常交互来触发。我还建议不遵循 CloudFlare 的具体建议,使用除“我受到攻击”之外的任何安全级别;在这一点上,我必须指出,即使每个请求不会发生 5 秒重定向,hCaptchas 也会在安全性上触发级别低、中和高。将安全级别设置为“基本关闭”并不意味着安全级别为空;此外,WAF 将捕获标准违规行为,当然可以根据 API 提供的服务进行调整。
希望这对 OP 有用,至少对其他潜在访客有用。
是的,CloudFlare 可以帮助实现 DDOS 保护,不,它不会为您的 API 实现缓存和速率限制。您需要自己实现这些功能,或者使用一个可以实现这些功能的框架。
您可以使用 CloudFlare 作为代理来保护您的 API 端点。CloudFlare 保护整个 URL 位,您可以使用页面规则来调整 api 端点的设置。
Example: https://api.example.com/*
Run Code Online (Sandbox Code Playgroud)
对于缓存 API
Create a page rule like https://api.example.com/*.json
Run Code Online (Sandbox Code Playgroud)
保护 API 的其他方法还有很多。希望这个答案有帮助吗?