如何使用 Cloud Armor 重定向处理 reCAPTCHA Enterprise

问题描述 投票:0回答:1

我已经在 Angular v16 应用程序中实现了带有 Cloud Armor 集成的 reCAPTCHA Enterprise,并且在阻止或允许流量时它按预期工作。但是我不确定如何实现重定向\挑战。

我想做的是

  • 阻止低分(工作)
  • 接受高分(工作)
  • 挑战中分(如何显示挑战页面?)

从日志中我可以看到云装甲会话令牌是有效的

securityPolicyRequestData: {
   recaptchaSessionToken: {
   score: 0.89999998
   }}
   statusDetails: "response_sent_by_backend"
}

在前端,HTTP GET 请求返回后端的预期结果或 HTML,这似乎是需要以某种方式显示的 reCAPTCHA 质询页面

const response$ = this.httpClient.post(url,  body, options );

response$ 有时是挑战页面 HTML,例如

<!doctype html><html lang="en-US" dir="ltr"><head><base href="https://www.google.com/recaptcha/challengep........

那么如果

response$
是 HTML - 如何显示它?

我尝试过仅设置 HTML

reCaptchaRender(body: string) {
    let recaptchaDOMElem = document.getElementById('recaptcha')
    recaptchaDOMElem!.innerHTML = body
}

还有一个带有 DOMSanitizer 的组件,但结果是一样的

@Component({
  selector: 'my-recaptcha',
  templateUrl: './recaptcha.component.html',
  styleUrls: ['./recaptcha.component.scss']
})
export class MyRecaptcha {

  @ViewChild('recaptcha') recaptcha: ElementRef | undefined;

  private _html: string = ''

  constructor(private sanitizer: DomSanitizer) {}

  @Input() 
    public set recaptchaHTML(val: string) {
      this._html = val;
      if (this.recaptcha) {
        this.recaptcha.nativeElement.innerHTML = (
          this.sanitizer.sanitize(SecurityContext.HTML,  this.sanitizer.bypassSecurityTrustHtml(this._html))
        )}
  }
}

然而这只会导致

并且应该是带有挑战的图片的叠加层永远不会显示。

日志中有 404 错误,这些错误可能相关也可能不相关

httpRequest: {
latency: "0.223792s"
remoteIp: "xxx.16.32.252"
requestMethod: "GET"
requestSize: "18"
requestUrl: "https://app.xxxxxxxx.com/_/mss/boq-recaptcha/_/ss/k=boq-recaptcha.RecaptchaChallengePageUi.rMQB95nZlqc.L.B1.O/am=BMO0/d=1/ed=1/rs=AP105ZiCwi8N5mUj4UtZch0cdCHAP5fEfQ/chrome.css.map"
responseSize: "168"
status: 404
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
insertId: "6nvowkfrbxo3o"

那么你如何处理挑战页面?

angular google-cloud-platform google-app-engine recaptcha recaptcha-enterprise
1个回答
0
投票

此处的 Cloud Armor 挑战页面重定向旨在保护 HTTP 路由级别的站点,而不是从 Web 应用程序进行的 API 调用。较低分数的 HTTP 请求被 302 重定向到 Google 挑战页面,因此即使您可以弄清楚如何在自己的网站上显示该 HTML,它也不会正确生成 reCAPTCHA 令牌,因为它们不是来自 Google -托管页面。

如果您只想保护您通过 POST 请求到达的后端端点,那么使用更传统的方法(在前端创建令牌然后使用该令牌调用 createAssessment() )来实现 reCAPTCHA 会更简单在您的后端查看分数。请参阅 https://cloud.google.com/recaptcha-enterprise/docs/setup-overview-web

如果您打算使用挑战页面来全面保护您的网站和内容免受机器人攻击,那么只需设置 Cloud Armor 规则即可,并让这些规则在看到低分后在后续页面加载时将访问者重定向到挑战页面。如果后端拦截了不应该拦截的 POST 请求,您可以使用额外的防火墙规则来免除对后端的 POST 请求。

使用挑战页面时要考虑的另一个因素 - 如果您所保护的内容足够有价值,足以让攻击者支付验证码农场的费用,那么挑战页面会为攻击者提供一种最终绕过您的保护的方法,从而对您不利。故意产生低分,然后通过农场挑战解决方案“兑换”他们的会话。在这些情况下,您最好使用其他方式来兑换真实用户(重定向到登录、2FA、标记交易以进行手动审核等)。

© www.soinside.com 2019 - 2024. All rights reserved.