Segurizando tu sitio con Google Recaptcha Enterprise

Gonzalo Mendoza
2 min readJul 12, 2021

--

Todos los días miles de sitios web son atacados mediante técnicas cada vez mas sofisticadas, lo cual hace indispensable, en toda organización, tomarse un tiempo prodencial en pensar y repensar la seguridad en la web

¿Qué nos ofrece Google Recaptcha Enterprise?

A modo de resumen: un servicio capaz de indicarnos si la interacción de un determinado usuario (probablemente un bot) se encuentra dentro de un determindo rango (area de riesgo)

El scoring de riesgo nos provee un número (entre 0.0 y 1.0) siendo 0.0 altisimo riesgo y 1.0 confianza total

Mas info aqui https://cloud.google.com/recaptcha-enterprise

¿Qué necesito para empezar?

  1. Crea una API Key -> https://cloud.google.com/recaptcha-enterprise/docs/create-key
  2. Crea una Cuenta de Servicio -> https://cloud.google.com/recaptcha-enterprise/docs/install-on-gcp

Esquema básico

Generación de evaluación de riesgo

Cliente Javascript

grecaptcha.enterprise.execute('RECAPTCHA_APIKEY', { action: 'SOME_ACTION' })
.then((token) => {
if (token == null || token.trim() === '') {
// Issue here, please handle
return;
}
// User your token (Send to backend)
})
.catch((googleError) => {
// Catch some error here
});

Backend Java

  1. Para cada llamada al servicio de Recaptcha Enterprise necesitaras un token de autenticacion
GoogleCredentials credentials =
GoogleCredentials.fromStream(new FileInputStream('recaptchaServiceAccountPath'))
.createScoped(Arrays.asList(
"https://www.googleapis.com/auth/cloud-platform"));
credentials.refreshIfExpired();
AccessToken token = credentials.getAccessToken();
return token.getTokenValue();

2. Teniendo en cuenta que la Cuenta de Servicio vive en un determinado proyecto, debe tener un project-id.

Debes enviar una request via POST a

https://recaptchaenterprise.googleapis.com/v1/projects/YOUR_PROYECT_ID/assessments

3. Puedes utilizar cualquier cliente http, en este caso utilizaré el cliente Resttemplate (Spring Boot)

Map<String, Object> requestMap = new HashMap<>();
Map<String, String> event = new HashMap<>();
event.put("token", "TOKEN_FROM_WEB_UI");
event.put("siteKey", "API_KEY");
event.put("expectedAction", "SOME_ACTION");
requestMap.put("event", event);MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("Content-Type", Arrays.asList(MediaType.APPLICATION_JSON_VALUE));
headers.set("Authorization", "Bearer " + "TOKEN_GENERATED_BY_SERVICE_ACCOUNT");
HttpEntity<Map<String, Object>> request = new HttpEntity<Map<String, Object>>(requestMap, headers);RecaptchaEnterpriseResponse apiResponse = restTemplate
.postForObject(recaptchaEnterpriseEndpoint, request, RecaptchaEnterpriseResponse.class);
// Handle result
return apiResponse.getRiskAnalysis().getScore(); // [0.0 - 1.0]

Beneficios

  • Máximo control sobre el uso nocivo de tu sitio por parte de atacantes
  • Simple de implementar
  • Monitoreo integrado en via API en Google Cloud Platform

--

--

Gonzalo Mendoza
Gonzalo Mendoza

Written by Gonzalo Mendoza

Software engineer dedicated to the creation, deployment and continuity of software solutions. With criticality and a broad analytical sense

No responses yet