reCAPTCHA v3网络密集型Web应用程序

时间:2018-05-15 09:24:06

标签: angular recaptcha

我在reCAPTCHA v3应用程序中使用Google Angular 2来防止自动提交表单。我的应用程序在后台进行许多网络呼叫,因为用户'与UI互动。

index.html开始,我故意进行阻止调用以加载库(阻止Angular世界在加载recaptcha/api.js之前进入):

<script src="https://www.google.com/recaptcha/api.js?render=reCAPTCHA_site_key"></script>

从Angular Service的构造函数中,我使用DOCUMENT DI token来引用grecaptcha对象:

  constructor(@Inject(DOCUMENT) private document: any) {
    this.grecaptcha = this.document.grecaptcha;
  }

加载应用程序后(使用lifecycle hooks),上述Angular服务调用grecaptcha.execute以获取唯一token(根据Frontend Integration指南) :

  public executeCaptcha() {
    this.grecaptcha.ready(() => {
      this.grecaptcha
        .execute(MyService.CAPTCHA_KEY, {
          action: 'execute'
        })
        .then((token: string) => this.token = token);
    });
  }

token是回调的参数,并存储为Angular服务的成员(this.token = token))。

此时,应用程序尚未对我的后端进行任何API调用,也未将用户验证为人员。

token必须发送到我的后端服务器,后端必须verify the user's response API Request

然后可以将API Response返回到浏览器(Angular app):

{
  "success": true|false,
  "challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
  "hostname": string,         // the hostname of the site where the reCAPTCHA was solved
  "error-codes": [...]        // optional
}

问题

  • 是否应该从我的Angular的每个HTTP请求发送token 应用程序,并每次验证?
    • ...或者用户可以在Angular应用中记住一次(在开始时)并记住他们的得分吗?
  • 我在某处读取了Google使用鼠标移动以及各种客户端信号来计算得分。
    • ...这是否意味着我应该(重新)定期验证以获得更高的分数?

1 个答案:

答案 0 :(得分:0)

如果您想确保安全,则每次用户通过表单发布数据时,都必须发送令牌(每次都是新令牌)。否则,如果用户发现您只是在他第一次单击发布时就在检查他,那么他就可以运行selenium或其他脚本程序,因为他的会话已经过验证。

请注意,您每次都需要向Google询问新令牌。首先,因为它们只允许您一次使用一个令牌,其次,令牌在到期之前具有很短的生存时间。这两个边界是为了防止我上面描述的漏洞。

当然,在安全性和性能之间总是要权衡取舍。我不建议您缓存验证数据,但是对于某些轻量级搜索,您可以考虑使用它,但是在发布数据,更新或删除数据时,我强烈建议您不要这样做。