reCAPTCHA v3 интенсивные веб-приложения - PullRequest
0 голосов
/ 15 мая 2018

Я использую reCAPTCHA v3 от Google в приложении Angular 2 для защиты от автоматической отправки форм. Мое приложение выполняет много сетевых вызовов в фоновом режиме, когда пользователи взаимодействуют с пользовательским интерфейсом.

С index.html я намеренно блокирую вызов, чтобы загрузить библиотеку (не позволяя миру Angular войти до загрузки recaptcha/api.js):

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

Из конструктора Angular Service Я использую токен DOCUMENT DI для ссылки на объект grecaptcha:

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

Как только приложение загружено (с использованием ловушек жизненного цикла ), вышеупомянутая служба 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 должен быть отправлен на мой внутренний сервер, который, в свою очередь, должен проверить ответ пользователя , сделав API-запрос .

Ответ API затем можно вернуть в браузер (приложение Angular):

{
  "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
}

Вопросы

  • Если token отправлять с каждым HTTP-запросом от моего Angular приложение, и проверено каждый раз?
    • ... или пользователь может быть проверен один раз (в начале) и его оценка запомнится в приложении Angular?
  • Я прочитал где-то , что Google использует движения мыши и различные сигналы на стороне клиента для вычисления оценки.
    • ... означает ли это, что я должен (пере) периодически проверять, чтобы получить улучшенный результат?

1 Ответ

0 голосов
/ 11 января 2019

Если вы хотите быть в безопасности, вы должны отправлять токен (каждый раз новый) каждый раз, когда пользователь публикует данные через формы. В противном случае, если пользователь узнает, что вы проверяете его только один раз, он сам может щелкнуть сообщение в первый раз, тогда он может запустить селен или другую программу сценариев, поскольку его сеанс уже будет проверен.

Обратите внимание, что вам нужно каждый раз запрашивать у Google новый токен. Во-первых, поскольку они позволяют использовать только один токен один раз, во-вторых, токен имеет малое время жизни, после которого истекает срок его действия. И эти две границы предназначены для защиты от уязвимости, которую я описал выше.

Конечно, всегда есть компромисс между безопасностью и производительностью. Я бы не рекомендовал кэшировать данные проверки, но, возможно, для какого-то облегченного поиска вы могли бы рассмотреть это, но я настоятельно рекомендую не использовать такую ​​практику при публикации данных, обновлении или удалении.

...