Spring Boot (Java)
W korporacyjnych aplikacjach Java najbardziej niezawodnym sposobem integracji ProxyTracer jest utworzenie globalnego HandlerInterceptor. Gwarantuje to weryfikację każdego przychodzącego żądania HTTP przed dotarciem do kontrolerów.
Interceptor
Ta implementacja bezpiecznie pobiera adres IP zza load balancera (obsługującX-Forwarded-For), odpytuje ProxyTracer za pomocą natywnego HttpClient w Javie i blokuje żądanie w przypadku wykrycia zagrożenia.
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)) // Ścisły limit czasu, aby zapobiec powstawaniu wąskich gardeł
.build();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. Bezpiecznie pobierz prawdziwy adres IP zza load balancerów / NGINX
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.isEmpty()) {
ipAddress = request.getRemoteAddr();
} else {
ipAddress = ipAddress.split(",")[0].trim();
}
// 2. Odpytaj API 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. Proste dopasowywanie tekstu (Omija ciężkie parsery JSON dla maksymalnej szybkości)
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; // Odrzuca żądanie
}
}
} catch (Exception e) {
// Fail-open: Zaloguj błąd i przepuść żądanie
System.err.println("ProxyTracer validation failed: " + e.getMessage());
}
// 4. Ruch jest czysty, przekaż żądanie do kontrolera
return true;
}
}Konfiguracja:
Pamiętaj, aby zarejestrować ten interceptor w klasie implementującej WebMvcConfigurer, aby zastosować go globalnie do tras w aplikacji.
Ostatnia aktualizacja: