C# (ASP.NET Core)
Kurumsal Microsoft ortamlarında ProxyTracer'ı doğrudan ASP.NET Core HTTP istek hattına entegre etmek, kötü amaçlı trafiğin yönlendirmeyi, model bağlamayı veya veritabanı sorgularını tetiklemeden önce reddedilmesini sağlar.
Middleware
Bu uygulama, son derece hızlı seri durumdan çıkarma için System.Text.Json kullanır, HttpClient aracılığıyla kesin bir zaman aşımı uygular ve tehdit algılanırsa 403 Forbidden yanıtıyla ardışık düzeni erkenden sonlandırır.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace ProxyTracer.Security
{
public class ProxyTracerMiddleware
{
private readonly RequestDelegate _next;
private readonly HttpClient _httpClient;
private readonly ILogger<ProxyTracerMiddleware> _logger;
private readonly string _apiKey;
public ProxyTracerMiddleware(RequestDelegate next, IConfiguration config, ILogger<ProxyTracerMiddleware> logger)
{
_next = next;
_logger = logger;
_apiKey = config["PROXYTRACER_API_KEY"] ?? throw new ArgumentNullException("PROXYTRACER_API_KEY is missing");
// Kesin 500ms zaman aşımlı yeniden kullanılabilir istemci
_httpClient = new HttpClient { Timeout = TimeSpan.FromMilliseconds(500) };
}
public async Task InvokeAsync(HttpContext context)
{
// 1. IP'yi çıkarın (Program.cs dosyasında app.UseForwardedHeaders() yapılandırması gerektirir)
var ip = context.Connection.RemoteIpAddress?.ToString();
// Yerel geliştirme IP'lerini atlayın
if (!string.IsNullOrEmpty(ip) && ip != "127.0.0.1" && ip != "::1")
{
try
{
// 2. ProxyTracer API'sini asenkron olarak sorgulayın
using var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.proxytracer.com/v1/check/{ip}");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _apiKey);
using var response = await _httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
using var jsonStream = await response.Content.ReadAsStreamAsync();
var ptResponse = await JsonSerializer.DeserializeAsync<ProxyTracerResult>(jsonStream);
// 3. Proxy/VPN tespit edilirse bağlantıyı kesin
if (ptResponse != null && ptResponse.Proxy)
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync("{\"error\": \"Access Denied: VPN or Proxy detected.\"}");
return; // İstek akışını (pipeline) erkenden sonlandırır
}
}
}
catch (Exception ex)
{
// Fail open: Hatayı günlüğe kaydedin ve isteğin geçmesine izin verin
_logger.LogWarning($"ProxyTracer validation failed: {ex.Message}");
}
}
// 4. Trafik temiz, controller'lara devam edin
await _next(context);
}
// Tam olarak {"proxy": true|false} yanıtına eşlenen hafif struct
private class ProxyTracerResult
{
[JsonPropertyName("proxy")]
public bool Proxy { get; set; }
}
}
}Yapılandırma:
Korumayı etkinleştirmek için middleware'i Program.cs dosyanıza kaydedin. UseForwardedHeaders metodundan sonra, ancak UseRouting ve UseAuthentication metodlarından önce yerleştirildiğinden emin olun.
var app = builder.Build();
// 1. Bir NGINX/Cloudflare yük dengeleyicisinin arkasındaysanız gerçek IP'lerin çıkarıldığından emin olun
app.UseForwardedHeaders();
// 2. Kötü niyetli trafiği erkenden düşürün
app.UseMiddleware<ProxyTracer.Security.ProxyTracerMiddleware>();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();Son güncelleme tarihi