Spring Boot (Java)
Para aplicaciones corporativas Java, la manera más robusta de integrar ProxyTracer es creando un HandlerInterceptor global. Esto garantiza que cada solicitud HTTP entrante se verifique antes de llegar a tus controladores.
El Interceptor
Esta implementación extrae con seguridad la IP desde el balanceador de carga (gestionandoX-Forwarded-For), llama a ProxyTracer usando el HttpClient nativo de Java y bloquea la solicitud si detecta riesgo.
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
@Component
public class ProxyTracerInterceptor implements HandlerInterceptor {
private static final String API_KEY = System.getenv("PROXYTRACER_API_KEY");
private final HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(500)) // Tiempo de espera estricto para evitar cuellos de botella
.build();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. Extraer de forma segura la IP real detrás de balanceadores de carga/NGINX
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.isEmpty()) {
ipAddress = request.getRemoteAddr();
} else {
ipAddress = ipAddress.split(",")[0].trim();
}
// 2. Consultar la API de ProxyTracer
HttpRequest ptRequest = HttpRequest.newBuilder()
.uri(URI.create("https://api.proxytracer.com/v1/check/" + ipAddress))
.header("Authorization", "Bearer " + API_KEY)
.GET()
.build();
try {
HttpResponse<String> ptResponse = httpClient.send(ptRequest, HttpResponse.BodyHandlers.ofString());
if (ptResponse.statusCode() == 200) {
// 3. Coincidencia simple de cadenas (evita bibliotecas pesadas de análisis de JSON para máxima velocidad)
if (ptResponse.body().contains("\"proxy\": true") || ptResponse.body().contains("\"proxy\":true")) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.getWriter().write("{\"error\": \"Access Denied: VPN or Proxy detected.\"}");
response.setContentType("application/json");
return false; // Descarta la petición
}
}
} catch (Exception e) {
// Fail open: registrar el error y permitir el paso de la solicitud
System.err.println("ProxyTracer validation failed: " + e.getMessage());
}
// 4. El tráfico está limpio, continuar hacia el controlador
return true;
}
}Configuración:
No olvides registrar este interceptor en tu clase WebMvcConfigurer para aplicarlo de forma global a todas las rutas de tu aplicación.
Última actualización el