可以使用Cloudflare缓存和保护REST API吗?

fle*_*ive 33 rest caching ddos cloudflare single-page-application

我正在设计一个RESTful API,旨在供单页应用程序和本机移动应用程序使用.此API的某些调用会返回可以缓存一段时间的公开结果.此外,需要速率保护来保护API免受未经授权的用户(蜘蛛)

我可以使用Cloudflare为我的RESTful API实现缓存和速率限制/ DDOS保护吗?

缓存: Cloudflare 支持HTTP缓存控制头,因此API可以决定通过GET请求的每个实体是否公开以及缓存多长时间.

  • 但是,目前尚不清楚缓存控制头是否也下游传递给客户端,因此还会触发浏览器缓存响应?这可能是不可取的,因为它可能使故障排除更加困难
  • Akamai有一个Edge-Control标头,可确保内容缓存在CDN中而不是浏览器中.可以用Cloudflare做类似的事吗?

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上).

int*_*tr0 6

这是 @flexresponsive 提出的一个 5 年前的问题,最新的答案是 3 年前写的,2 年前评论过的。虽然我确信 OP 现已找到解决方案,无论是在 CloudFlare 内还是其他地方,我将以现代(2020)方式更新给出的解决方案,并保留在 CloudFlare 内。详细的页面规则对任何人来说总是一个好主意;然而,对于 OP 的特定需求,这个特定的集合与“CloudFlare Workers”脚本相结合将是有益的:

  1. Edge Cache TTL: (n)time设置为 CloudFlare 沿其“边缘”缓存 API 内容所需的时间(从边缘节点/服务器场位置出发的路由取决于用户的帐户计划,“免费”优先级最低,因此更有可能提供内容从延迟较高的位置到您的消费者。

  2. 但是Edge Cache TTL> 0(基本上根本不使用它)这将不允许设置以下内容,这对您的 API 可能重要也可能不重要:

  3. Cache Deception Armor:ON

  4. Origin Cache ControlON 如果正在使用 #3 并且您想要执行以下操作

  5. 使用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 有用,至少对其他潜在访客有用。


Soj*_*axi 5

是的,CloudFlare 可以帮助实现 DDOS 保护,不,它不会为您的 API 实现缓存和速率限制。您需要自己实现这些功能,或者使用一个可以实现这些功能的框架。

您可以使用 CloudFlare 作为代理来保护您的 API 端点。CloudFlare 保护整个 URL 位,您可以使用页面规则来调整 api 端点的设置。

Example: https://api.example.com/*
Run Code Online (Sandbox Code Playgroud)
  • 将此规则的安全性降低到低或中,以便不显示验证码。
  • API 并不意味着向验证码显示您使用授权和访问代码来保护它们。
  • 您可以在标头上实现 HTTP 严格传输安全和访问控制标头。
  • 云托管提供商(例如 DigitalOcean、Vultr 等)提供免费或付费的 DDoS 保护。您可以在面向公众的虚拟机上订阅它。这将是一个很大的优势,因为现在您拥有双重 DDOS 保护。

对于缓存 API

Create a page rule like https://api.example.com/*.json
Run Code Online (Sandbox Code Playgroud)
  • 设置该规则的缓存级别,以便 CloudFlare 将其缓存在其服务器上特定的持续时间。

保护 API 的其他方法还有很多。希望这个答案有帮助吗?


hof*_*ffm 5

Cloudflare发布将其与API结合使用的最佳做法的列表

TL; DR,他们建议设置用于修补所有API请求的页面规则,并在其上放置以下设置:

  1. 缓存级别:绕过
  2. 始终在线:关闭
  3. Web应用程序防火墙:关闭
  4. 安全级别: “我受到攻击”之外的任何内容
  5. 浏览器完整性检查:关闭

  • 它的基本意思是“全部禁用”。通过Cloudflare传递API流量不再有意义(除了仅隐藏IP)? (2认同)
  • 考虑到这个“禁用”列表,我想知道通过 Cloudflare 获取纯 REST-y API 是否有用。您的云托管提供商可能会提供某种 DDOS 保护,而无需使用外部代理。 (2认同)