You are here

netacea_integration_init.html.twig in Fastly 8.3

backend F_MitSvc {
  .between_bytes_timeout = 0.5s;
  .connect_timeout = 1s;
  .dynamic = true;
  .first_byte_timeout = 1s;
  .host = "mitigations.netacea.net";
  .max_connections = 200;
  .port = "443";
  .share_key = "NETACEAmitigations";
  .ssl = true;
  .ssl_cert_hostname = "mitigations.netacea.net";
  .ssl_check_cert = always;
  .ssl_sni_hostname = "mitigations.netacea.net";
  .probe = {
    .dummy = true;
    .initial = 5;
    .request = "HEAD / HTTP/1.1"  "Host: mitigations.netacea.net" "Connection: close";
    .threshold = 1;
    .timeout = 2s;
    .window = 5;
  }
}

sub netacea_recv {
  # Change this value to false to bypass Netacea
  declare local var.netacea_mitSvc_enabled BOOL;
  set var.netacea_mitSvc_enabled = true;

  unset req.http.X-Netacea-UserId;

  # Unset headers Netacea Set
  unset req.http.netacea_processed;
  if (req.restarts == 0) {
    unset req.http.netacea_bctype_string;
    unset req.http.netacea_best_mitigation;
    unset req.http.netacea_match;
    unset req.http.netacea_mitigate;
    unset req.http.netacea_captcha;
  } else {
    if (req.http.netacea_best_mitigation == "block") {
      error 403;
    }
  }

  declare local var.netacea_mitSvc_forward BOOL;
  declare local var.netacea_mitSvc_apiKey STRING;
  declare local var.netacea_mitSvc_secret STRING;

  set var.netacea_mitSvc_apiKey = "{{ api_key }}";
  set var.netacea_mitSvc_secret = "{{ secret }}";

  declare local var.netacea_mitSvc_exp STRING;
  declare local var.netacea_mitSvc_sig STRING;
  declare local var.netacea_mitSvc_userId STRING;
  declare local var.netacea_valid_atacookie BOOL;
  declare local var.netacea_mitigation_code STRING;

  set var.netacea_mitSvc_forward = true;

  if (req.http.Cookie:_mitata) {
    if (req.http.Cookie:_mitata ~ "(.*)_\/@#\/(.*)_\/@#\/(.*)_\/@#\/((\d)(\d)(\d))") {
      set var.netacea_valid_atacookie = true;
      set var.netacea_mitSvc_sig = re.group.1;
      set var.netacea_mitSvc_exp = re.group.2;
      set var.netacea_mitSvc_userId = re.group.3;
      set var.netacea_mitigation_code = re.group.4;
      set req.http.netacea_match = re.group.5;
      set req.http.netacea_mitigate = re.group.6;
      set req.http.netacea_captcha = re.group.7;
    } else {
      set var.netacea_valid_atacookie = false;
    }
  }
  if (req.restarts == 0) {
    if (var.netacea_mitSvc_enabled) {
      if (var.netacea_valid_atacookie) {
        set var.netacea_mitSvc_forward = true;
        if (!time.is_after(now, std.time(var.netacea_mitSvc_exp, now))) {
          declare local var.netacea_mitSvc_stringValue STRING;
          declare local var.netacea_mitSvc_HMAC STRING;
          declare local var.netacea_mitSvc_B64 STRING;
          set var.netacea_mitSvc_stringValue = var.netacea_mitSvc_exp + "_/@#/" + var.netacea_mitSvc_userId + "_/@#/" + var.netacea_mitigation_code;
          set var.netacea_mitSvc_HMAC = digest.hmac_sha256(var.netacea_mitSvc_secret, var.netacea_mitSvc_stringValue);
          if (var.netacea_mitSvc_HMAC ~ "0x(.*)") {
            set var.netacea_mitSvc_HMAC = re.group.1;
          }
          set var.netacea_mitSvc_B64 = digest.base64(var.netacea_mitSvc_HMAC);
          if (var.netacea_mitSvc_sig == var.netacea_mitSvc_B64) {
            set var.netacea_mitSvc_forward = false;
          }
        }
      }
    } else {
    set var.netacea_mitSvc_forward = false;
    }
  } else {
  set var.netacea_mitSvc_forward = false;
  }
  set req.http.mitigation_user_id = var.netacea_mitSvc_userId;

  if (var.netacea_mitSvc_forward) {
    set req.backend = F_MitSvc;
    if (req.backend.healthy) {
      unset req.http.netacea_match;
      unset req.http.netacea_mitigate;
      unset req.http.netacea_captcha;

      set req.http.netacea_origin_method = req.method;
      set req.http.netacea_processed = "1";
      set req.http.netacea_origin_host = req.http.host;
      set req.http.X-Netacea-Client-IP = client.ip;
      set req.http.netacea_origin_url = req.url;
      if (req.url != "/AtaVerifyCaptcha") {
        set req.method = "GET";
        set req.url = "/";
      }
      set req.http.X-Netacea-Api-Key = var.netacea_mitSvc_apiKey;
      return(pass);
    }
  }
}

sub netacea_deliver {
  call netacea_calculate_best_mitigation;

  if (req.http.netacea_processed == "1") {
    set req.http.mit_status = resp.status;
    if (resp.status != 200) {
      // Unset these because we're not mitigating anything.
      set req.http.netacea_best_mitigation = "";
      set req.http.netacea_bctype_string = "";
    }
    set req.http.host = req.http.netacea_origin_host;
    set req.url = req.http.netacea_origin_url;
    set req.method = req.http.netacea_origin_method;
    set req.http.netacea_cookies = resp.http.set-cookie;
    set req.http.netacea_mitata_cookie_value = resp.http.x-netacea-mitata-value;
    set req.http.netacea_mitata_cookie_expiry = resp.http.x-netacea-mitata-expiry;
    set req.http.netacea_mitata_captcha_cookie_value = resp.http.x-netacea-mitatacaptcha-value;
    set req.http.netacea_mitata_captcha_cookie_expiry = resp.http.x-netacea-mitatacaptcha-expiry;

    unset req.http.netacea_mitSvc_forward;
    unset req.http.netacea_origin_url;
    unset req.http.netacea_origin_host;
    unset req.http.netacea_origin_method;
    unset req.http.x-netacea-api-key;
    call set_netacea_cookies;
    if (req.http.netacea_best_mitigation != "captcha") {
      restart;
    }
    set resp.status = 403;
    set resp.http.content-type = "text/html; charset=UTF-8";
    return(deliver);
  }
  call set_netacea_cookies;
}

sub set_netacea_cookies {
  # Builds netacea cookies
  if (req.http.netacea_cookies) {
    if (req.http.netacea_mitata_cookie_value && req.http.netacea_mitata_cookie_expiry) {
      if (req.http.netacea_mitata_cookie_value ~ "(.*)_\/@#\/(.*)_\/@#\/(.*)_\/@#\/((\d)(\d)(\d))") {
        set req.http.mitigation_user_id = re.group.3;
      }
      add resp.http.Set-Cookie= "_mitata=" + req.http.netacea_mitata_cookie_value + "; Max-Age=" + req.http.netacea_mitata_cookie_expiry + "; Path=/;";
    }
    if (req.http.netacea_mitata_captcha_cookie_value && req.http.netacea_mitata_captcha_cookie_expiry) {
      add resp.http.Set-Cookie= "_mitatacaptcha=" + req.http.netacea_mitata_captcha_cookie_value + "; Max-Age=" + req.http.netacea_mitata_captcha_cookie_expiry + "; Path=/;";
    }
  }
}

table Netacea_Match_Dict {
  "0": "",
  "1": "ua",
  "2": "ip",
  "3": "visitor",
  "4": "datacenter",
  "5": "sev"
}

table Netacea_Mitigate_Dict {
  "0": "",
  "1": "blocked",
  "2": "allow",
  "3": "hardblocked"
}

table Netacea_Best_Mitigations_Dict {
  "0": "",
  "1": "block",
  "2": "allow",
  "3": "block"
}

table Netacea_Best_Mitigations_Captcha_Dict {
  "1": "captcha",
  "2": "",
  "3": "captcha",
  "4": "",
  "5": "captcha"
}

table Netacea_Captcha_Dict {
  "0": "",
  "1": "captcha_serve",
  "2": "captcha_pass",
  "3": "captcha_fail",
  "4": "captcha_cookiepass",
  "5": "captcha_cookiefail",
}

sub netacea_calculate_best_mitigation {
  if (!req.http.netacea_bctype_string) {
    declare local var.netacea_match STRING;
    declare local var.netacea_mitigate STRING;
    declare local var.netacea_captcha STRING;
    declare local var.netacea_match_string STRING;
    declare local var.netacea_mitigate_string STRING;
    declare local var.netacea_captcha_string STRING;
    declare local var.netacea_captcha_mitigate_string STRING;

    declare local var.netacea_best_mitigation STRING;
    declare local var.netacea_bctype_string STRING;

    if (resp.http.x-netacea-match) { # If netacea mitigation service returns a match, use this
      set var.netacea_match = resp.http.x-netacea-match;
    } elseif (req.http.netacea_match) { # If cookie has a match, use this
      set var.netacea_match = req.http.netacea_match;
    } else {
      set var.netacea_match = "0";
    }

    if (resp.http.x-netacea-mitigate) { # If netacea mitigation service returns a mitigate, use this
      set var.netacea_mitigate = resp.http.x-netacea-mitigate;
    } elseif (req.http.netacea_mitigate) { # If cookie has a mitigate, use this
      set var.netacea_mitigate = req.http.netacea_mitigate;
    } else {
      set var.netacea_mitigate = "0";
    }

    if (resp.http.x-netacea-captcha) { # If netacea mitigation service returns a captcha, use this
      set var.netacea_captcha = resp.http.x-netacea-captcha;
    } elseif (req.http.netacea_captcha) { # If cookie has a captcha, use this
      set var.netacea_captcha = req.http.netacea_captcha;
    } else {
      set var.netacea_captcha = "0";
    }


    # IP, UA, Visitor, Datacentre etc
    if (var.netacea_match) {
      set var.netacea_match_string = table.lookup(Netacea_Match_Dict, var.netacea_match, "unknown");

      if (var.netacea_match_string != "") {
        set var.netacea_bctype_string = var.netacea_match_string + "_";
      }
    }

    # BLOCK, TRUST, HARDBLOCK etc
    if (var.netacea_mitigate) {
      set var.netacea_mitigate_string = table.lookup(Netacea_Mitigate_Dict, var.netacea_mitigate, "unknown");

      if (var.netacea_mitigate_string != "") {
        set var.netacea_bctype_string = var.netacea_bctype_string + var.netacea_mitigate_string;
      }

      set var.netacea_best_mitigation = table.lookup(Netacea_Best_Mitigations_Dict, var.netacea_mitigate, "no-best-mitigation");
      if (var.netacea_best_mitigation == "no-best-mitigation") {
        set var.netacea_best_mitigation = "";
      }
    }

    if (var.netacea_captcha) {
      # 2 and 3 can only be set on /AtaVerifyCaptcha requests
      # If it's not 2 or 3 then set them to the cookie variant
      if (req.url != "/AtaVerifyCaptcha") {
        if (var.netacea_captcha == "2") {
          set var.netacea_captcha = "4";
        } elseif (var.netacea_captcha == "3") {
          set var.netacea_captcha = "5";
        }
      }
      set var.netacea_captcha_string = table.lookup(Netacea_Captcha_Dict, var.netacea_captcha, "unknown");

      if (var.netacea_captcha_string != "") {
        set var.netacea_bctype_string = var.netacea_bctype_string + "," + var.netacea_captcha_string;
      }
      set var.netacea_captcha_mitigate_string = table.lookup(Netacea_Best_Mitigations_Captcha_Dict, var.netacea_captcha, "no-best-captcha-mitigation");
      set req.http.captcha_mitigate_thing = var.netacea_captcha_mitigate_string;
      if (var.netacea_captcha_mitigate_string != "no-best-captcha-mitigation") {
        set var.netacea_best_mitigation = var.netacea_captcha_mitigate_string;
      }
    }

    set req.http.netacea_bctype_string = var.netacea_bctype_string;
    set req.http.netacea_best_mitigation = var.netacea_best_mitigation;

    # Unset x-netacea headers
    unset resp.http.x-netacea-match;
    unset resp.http.x-netacea-mitigate;
    unset resp.http.x-netacea-captcha;

  }
}

File

fastly_edge_modules/templates/netacea_integration_init.html.twig
View source
  1. backend F_MitSvc {
  2. .between_bytes_timeout = 0.5s;
  3. .connect_timeout = 1s;
  4. .dynamic = true;
  5. .first_byte_timeout = 1s;
  6. .host = "mitigations.netacea.net";
  7. .max_connections = 200;
  8. .port = "443";
  9. .share_key = "NETACEAmitigations";
  10. .ssl = true;
  11. .ssl_cert_hostname = "mitigations.netacea.net";
  12. .ssl_check_cert = always;
  13. .ssl_sni_hostname = "mitigations.netacea.net";
  14. .probe = {
  15. .dummy = true;
  16. .initial = 5;
  17. .request = "HEAD / HTTP/1.1" "Host: mitigations.netacea.net" "Connection: close";
  18. .threshold = 1;
  19. .timeout = 2s;
  20. .window = 5;
  21. }
  22. }
  23. sub netacea_recv {
  24. # Change this value to false to bypass Netacea
  25. declare local var.netacea_mitSvc_enabled BOOL;
  26. set var.netacea_mitSvc_enabled = true;
  27. unset req.http.X-Netacea-UserId;
  28. # Unset headers Netacea Set
  29. unset req.http.netacea_processed;
  30. if (req.restarts == 0) {
  31. unset req.http.netacea_bctype_string;
  32. unset req.http.netacea_best_mitigation;
  33. unset req.http.netacea_match;
  34. unset req.http.netacea_mitigate;
  35. unset req.http.netacea_captcha;
  36. } else {
  37. if (req.http.netacea_best_mitigation == "block") {
  38. error 403;
  39. }
  40. }
  41. declare local var.netacea_mitSvc_forward BOOL;
  42. declare local var.netacea_mitSvc_apiKey STRING;
  43. declare local var.netacea_mitSvc_secret STRING;
  44. set var.netacea_mitSvc_apiKey = "{{ api_key }}";
  45. set var.netacea_mitSvc_secret = "{{ secret }}";
  46. declare local var.netacea_mitSvc_exp STRING;
  47. declare local var.netacea_mitSvc_sig STRING;
  48. declare local var.netacea_mitSvc_userId STRING;
  49. declare local var.netacea_valid_atacookie BOOL;
  50. declare local var.netacea_mitigation_code STRING;
  51. set var.netacea_mitSvc_forward = true;
  52. if (req.http.Cookie:_mitata) {
  53. if (req.http.Cookie:_mitata ~ "(.*)_\/@#\/(.*)_\/@#\/(.*)_\/@#\/((\d)(\d)(\d))") {
  54. set var.netacea_valid_atacookie = true;
  55. set var.netacea_mitSvc_sig = re.group.1;
  56. set var.netacea_mitSvc_exp = re.group.2;
  57. set var.netacea_mitSvc_userId = re.group.3;
  58. set var.netacea_mitigation_code = re.group.4;
  59. set req.http.netacea_match = re.group.5;
  60. set req.http.netacea_mitigate = re.group.6;
  61. set req.http.netacea_captcha = re.group.7;
  62. } else {
  63. set var.netacea_valid_atacookie = false;
  64. }
  65. }
  66. if (req.restarts == 0) {
  67. if (var.netacea_mitSvc_enabled) {
  68. if (var.netacea_valid_atacookie) {
  69. set var.netacea_mitSvc_forward = true;
  70. if (!time.is_after(now, std.time(var.netacea_mitSvc_exp, now))) {
  71. declare local var.netacea_mitSvc_stringValue STRING;
  72. declare local var.netacea_mitSvc_HMAC STRING;
  73. declare local var.netacea_mitSvc_B64 STRING;
  74. set var.netacea_mitSvc_stringValue = var.netacea_mitSvc_exp + "_/@#/" + var.netacea_mitSvc_userId + "_/@#/" + var.netacea_mitigation_code;
  75. set var.netacea_mitSvc_HMAC = digest.hmac_sha256(var.netacea_mitSvc_secret, var.netacea_mitSvc_stringValue);
  76. if (var.netacea_mitSvc_HMAC ~ "0x(.*)") {
  77. set var.netacea_mitSvc_HMAC = re.group.1;
  78. }
  79. set var.netacea_mitSvc_B64 = digest.base64(var.netacea_mitSvc_HMAC);
  80. if (var.netacea_mitSvc_sig == var.netacea_mitSvc_B64) {
  81. set var.netacea_mitSvc_forward = false;
  82. }
  83. }
  84. }
  85. } else {
  86. set var.netacea_mitSvc_forward = false;
  87. }
  88. } else {
  89. set var.netacea_mitSvc_forward = false;
  90. }
  91. set req.http.mitigation_user_id = var.netacea_mitSvc_userId;
  92. if (var.netacea_mitSvc_forward) {
  93. set req.backend = F_MitSvc;
  94. if (req.backend.healthy) {
  95. unset req.http.netacea_match;
  96. unset req.http.netacea_mitigate;
  97. unset req.http.netacea_captcha;
  98. set req.http.netacea_origin_method = req.method;
  99. set req.http.netacea_processed = "1";
  100. set req.http.netacea_origin_host = req.http.host;
  101. set req.http.X-Netacea-Client-IP = client.ip;
  102. set req.http.netacea_origin_url = req.url;
  103. if (req.url != "/AtaVerifyCaptcha") {
  104. set req.method = "GET";
  105. set req.url = "/";
  106. }
  107. set req.http.X-Netacea-Api-Key = var.netacea_mitSvc_apiKey;
  108. return(pass);
  109. }
  110. }
  111. }
  112. sub netacea_deliver {
  113. call netacea_calculate_best_mitigation;
  114. if (req.http.netacea_processed == "1") {
  115. set req.http.mit_status = resp.status;
  116. if (resp.status != 200) {
  117. // Unset these because we're not mitigating anything.
  118. set req.http.netacea_best_mitigation = "";
  119. set req.http.netacea_bctype_string = "";
  120. }
  121. set req.http.host = req.http.netacea_origin_host;
  122. set req.url = req.http.netacea_origin_url;
  123. set req.method = req.http.netacea_origin_method;
  124. set req.http.netacea_cookies = resp.http.set-cookie;
  125. set req.http.netacea_mitata_cookie_value = resp.http.x-netacea-mitata-value;
  126. set req.http.netacea_mitata_cookie_expiry = resp.http.x-netacea-mitata-expiry;
  127. set req.http.netacea_mitata_captcha_cookie_value = resp.http.x-netacea-mitatacaptcha-value;
  128. set req.http.netacea_mitata_captcha_cookie_expiry = resp.http.x-netacea-mitatacaptcha-expiry;
  129. unset req.http.netacea_mitSvc_forward;
  130. unset req.http.netacea_origin_url;
  131. unset req.http.netacea_origin_host;
  132. unset req.http.netacea_origin_method;
  133. unset req.http.x-netacea-api-key;
  134. call set_netacea_cookies;
  135. if (req.http.netacea_best_mitigation != "captcha") {
  136. restart;
  137. }
  138. set resp.status = 403;
  139. set resp.http.content-type = "text/html; charset=UTF-8";
  140. return(deliver);
  141. }
  142. call set_netacea_cookies;
  143. }
  144. sub set_netacea_cookies {
  145. # Builds netacea cookies
  146. if (req.http.netacea_cookies) {
  147. if (req.http.netacea_mitata_cookie_value && req.http.netacea_mitata_cookie_expiry) {
  148. if (req.http.netacea_mitata_cookie_value ~ "(.*)_\/@#\/(.*)_\/@#\/(.*)_\/@#\/((\d)(\d)(\d))") {
  149. set req.http.mitigation_user_id = re.group.3;
  150. }
  151. add resp.http.Set-Cookie= "_mitata=" + req.http.netacea_mitata_cookie_value + "; Max-Age=" + req.http.netacea_mitata_cookie_expiry + "; Path=/;";
  152. }
  153. if (req.http.netacea_mitata_captcha_cookie_value && req.http.netacea_mitata_captcha_cookie_expiry) {
  154. add resp.http.Set-Cookie= "_mitatacaptcha=" + req.http.netacea_mitata_captcha_cookie_value + "; Max-Age=" + req.http.netacea_mitata_captcha_cookie_expiry + "; Path=/;";
  155. }
  156. }
  157. }
  158. table Netacea_Match_Dict {
  159. "0": "",
  160. "1": "ua",
  161. "2": "ip",
  162. "3": "visitor",
  163. "4": "datacenter",
  164. "5": "sev"
  165. }
  166. table Netacea_Mitigate_Dict {
  167. "0": "",
  168. "1": "blocked",
  169. "2": "allow",
  170. "3": "hardblocked"
  171. }
  172. table Netacea_Best_Mitigations_Dict {
  173. "0": "",
  174. "1": "block",
  175. "2": "allow",
  176. "3": "block"
  177. }
  178. table Netacea_Best_Mitigations_Captcha_Dict {
  179. "1": "captcha",
  180. "2": "",
  181. "3": "captcha",
  182. "4": "",
  183. "5": "captcha"
  184. }
  185. table Netacea_Captcha_Dict {
  186. "0": "",
  187. "1": "captcha_serve",
  188. "2": "captcha_pass",
  189. "3": "captcha_fail",
  190. "4": "captcha_cookiepass",
  191. "5": "captcha_cookiefail",
  192. }
  193. sub netacea_calculate_best_mitigation {
  194. if (!req.http.netacea_bctype_string) {
  195. declare local var.netacea_match STRING;
  196. declare local var.netacea_mitigate STRING;
  197. declare local var.netacea_captcha STRING;
  198. declare local var.netacea_match_string STRING;
  199. declare local var.netacea_mitigate_string STRING;
  200. declare local var.netacea_captcha_string STRING;
  201. declare local var.netacea_captcha_mitigate_string STRING;
  202. declare local var.netacea_best_mitigation STRING;
  203. declare local var.netacea_bctype_string STRING;
  204. if (resp.http.x-netacea-match) { # If netacea mitigation service returns a match, use this
  205. set var.netacea_match = resp.http.x-netacea-match;
  206. } elseif (req.http.netacea_match) { # If cookie has a match, use this
  207. set var.netacea_match = req.http.netacea_match;
  208. } else {
  209. set var.netacea_match = "0";
  210. }
  211. if (resp.http.x-netacea-mitigate) { # If netacea mitigation service returns a mitigate, use this
  212. set var.netacea_mitigate = resp.http.x-netacea-mitigate;
  213. } elseif (req.http.netacea_mitigate) { # If cookie has a mitigate, use this
  214. set var.netacea_mitigate = req.http.netacea_mitigate;
  215. } else {
  216. set var.netacea_mitigate = "0";
  217. }
  218. if (resp.http.x-netacea-captcha) { # If netacea mitigation service returns a captcha, use this
  219. set var.netacea_captcha = resp.http.x-netacea-captcha;
  220. } elseif (req.http.netacea_captcha) { # If cookie has a captcha, use this
  221. set var.netacea_captcha = req.http.netacea_captcha;
  222. } else {
  223. set var.netacea_captcha = "0";
  224. }
  225. # IP, UA, Visitor, Datacentre etc
  226. if (var.netacea_match) {
  227. set var.netacea_match_string = table.lookup(Netacea_Match_Dict, var.netacea_match, "unknown");
  228. if (var.netacea_match_string != "") {
  229. set var.netacea_bctype_string = var.netacea_match_string + "_";
  230. }
  231. }
  232. # BLOCK, TRUST, HARDBLOCK etc
  233. if (var.netacea_mitigate) {
  234. set var.netacea_mitigate_string = table.lookup(Netacea_Mitigate_Dict, var.netacea_mitigate, "unknown");
  235. if (var.netacea_mitigate_string != "") {
  236. set var.netacea_bctype_string = var.netacea_bctype_string + var.netacea_mitigate_string;
  237. }
  238. set var.netacea_best_mitigation = table.lookup(Netacea_Best_Mitigations_Dict, var.netacea_mitigate, "no-best-mitigation");
  239. if (var.netacea_best_mitigation == "no-best-mitigation") {
  240. set var.netacea_best_mitigation = "";
  241. }
  242. }
  243. if (var.netacea_captcha) {
  244. # 2 and 3 can only be set on /AtaVerifyCaptcha requests
  245. # If it's not 2 or 3 then set them to the cookie variant
  246. if (req.url != "/AtaVerifyCaptcha") {
  247. if (var.netacea_captcha == "2") {
  248. set var.netacea_captcha = "4";
  249. } elseif (var.netacea_captcha == "3") {
  250. set var.netacea_captcha = "5";
  251. }
  252. }
  253. set var.netacea_captcha_string = table.lookup(Netacea_Captcha_Dict, var.netacea_captcha, "unknown");
  254. if (var.netacea_captcha_string != "") {
  255. set var.netacea_bctype_string = var.netacea_bctype_string + "," + var.netacea_captcha_string;
  256. }
  257. set var.netacea_captcha_mitigate_string = table.lookup(Netacea_Best_Mitigations_Captcha_Dict, var.netacea_captcha, "no-best-captcha-mitigation");
  258. set req.http.captcha_mitigate_thing = var.netacea_captcha_mitigate_string;
  259. if (var.netacea_captcha_mitigate_string != "no-best-captcha-mitigation") {
  260. set var.netacea_best_mitigation = var.netacea_captcha_mitigate_string;
  261. }
  262. }
  263. set req.http.netacea_bctype_string = var.netacea_bctype_string;
  264. set req.http.netacea_best_mitigation = var.netacea_best_mitigation;
  265. # Unset x-netacea headers
  266. unset resp.http.x-netacea-match;
  267. unset resp.http.x-netacea-mitigate;
  268. unset resp.http.x-netacea-captcha;
  269. }
  270. }