网络安全新武器:C# Titanium Web Proxy助你监控全系统HTTP流量

Titanium Web Proxy是一个强大的开源.NET库,用于截获、查看和修改HTTP/HTTPS流量。本文将详细介绍如何使用Titanium Web Proxy来截获系统中的所有HTTP通信,并提供多个实用示例。

安装Titanium Web Proxy

首先,通过NuGet包管理器安装Titanium Web Proxy:

Install-Package Titanium.Web.Proxy

或者在你的项目文件中添加以下引用:

<PackageReference Include="Titanium.Web.Proxy" Version="3.1.1397" />

基本用法

以下是一个基本的示例,展示如何设置Titanium Web Proxy并开始截获HTTP流量:

using System;
using System.Threading.Tasks;
using Titanium.Web.Proxy;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Models;

class Program
{
    static async Task Main(string[] args)
    {
        var proxyServer = new ProxyServer();

        // 创建一个显式端点
        var explicitEndPoint = new ExplicitProxyEndPoint(System.Net.IPAddress.Any, 8000, true);

        // 添加端点
        proxyServer.AddEndPoint(explicitEndPoint);

        // 注册事件处理程序
        proxyServer.BeforeRequest += OnRequest;
        proxyServer.BeforeResponse += OnResponse;

        // 启动代理服务器
        proxyServer.Start();

        // 将代理设置为系统代理
        proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
        proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);

        Console.WriteLine("代理服务器已启动在端口 8000。按任意键退出...");
        Console.ReadKey();

        // 停止代理服务器
        proxyServer.Stop();
    }

    private static Task OnRequest(object sender, SessionEventArgs e)
    {
        Console.WriteLine(#34;请求: {e.HttpClient.Request.Url}");
        return Task.CompletedTask;
    }

    private static Task OnResponse(object sender, SessionEventArgs e)
    {
        Console.WriteLine(#34;响应: {e.HttpClient.Request.Url}, 状态码: {e.HttpClient.Response.StatusCode}");
        return Task.CompletedTask;
    }
}

这个基本示例设置了一个代理服务器,监听所有接口的8000端口,并将其设置为系统代理。它会打印出所有请求和响应的基本信息。

高级功能

修改请求和响应

Titanium Web Proxy允许你修改请求和响应。以下是一个更复杂的示例:

private static async Task OnRequest(object sender, SessionEventArgs e)
{
    Console.WriteLine(#34;请求: {e.HttpClient.Request.Method} {e.HttpClient.Request.Url}");

    // 修改请求头
    e.HttpClient.Request.Headers.AddHeader("X-Intercepted-By", "Titanium");

    // 修改请求体 (如果是POST请求)
    if (e.HttpClient.Request.Method == "POST")
    {
        string body = await e.GetRequestBodyAsString();
        body = body.Replace("oldValue", "newValue");
        e.SetRequestBodyString(body);
    }

    // 重定向请求
    if (e.HttpClient.Request.RequestUri.Host.Contains("example.com"))
    {
        e.Redirect("https://google.com");
    }
}

private static async Task OnResponse(object sender, SessionEventArgs e)
{
    Console.WriteLine(#34;响应: {e.HttpClient.Request.Url}, 状态码: {e.HttpClient.Response.StatusCode}");

    // 修改响应头
    e.HttpClient.Response.Headers.AddHeader("X-Proxy-Modified", "True");

    // 修改响应体
    if (e.HttpClient.Response.ContentType != null && e.HttpClient.Response.ContentType.Trim().ToLower().Contains("text/html"))
    {
        string body = await e.GetResponseBodyAsString();
        body = body.Replace("</body>", "<script>alert('Intercepted by Titanium!');</script></body>");
        e.SetResponseBodyString(body);
    }
}

处理HTTPS流量

Titanium Web Proxy可以解密HTTPS流量。默认情况下,它会为每个域生成一个自签名证书。你可以自定义这个行为:

// 在Main方法中
proxyServer.CertificateManager.CreateRootCertificate(false);
proxyServer.CertificateManager.TrustRootCertificate(true);

// 可选:使用自定义证书
// var certificate = new X509Certificate2("path_to_pfx_file", "password");
// proxyServer.CertificateManager.RootCertificate = certificate;

// 设置服务器证书验证回调
proxyServer.ServerCertificateValidationCallback += OnCertificateValidation;

// ...

private static Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
{
    // 总是信任远程证书
    e.IsValid = true;
    return Task.CompletedTask;
}

自定义证书验证

你可以实现自定义的证书验证逻辑:

private static Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
{
    if (e.SslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
    {
        e.IsValid = true;
    }
    else
    {
        // 自定义验证逻辑
        if (e.ServerCertificate.Subject.Contains("trusted-domain.com"))
        {
            e.IsValid = true;
        }
        else
        {
            e.IsValid = false;
        }
    }
    return Task.CompletedTask;
}

处理WebSocket连接

Titanium Web Proxy也支持拦截WebSocket连接:

private static async Task OnRequest(object sender, SessionEventArgs e)
{
    if (e.HttpClient.Request.Method == "CONNECT" && e.HttpClient.ConnectRequest.TunnelType == TunnelType.Websocket)
    {
        Console.WriteLine(#34;WebSocket连接: {e.HttpClient.Request.Url}");

        // 你可以在这里修改WebSocket握手请求  
        e.HttpClient.Request.Headers.AddHeader("X-WebSocket-Intercepted", "True");

        // 如果你想拦截WebSocket消息,可以这样做:  
        e.DataReceived += OnWebSocketDataReceived;
        e.DataSent += OnWebSocketDataSent;
    }
}

private static void OnWebSocketDataReceived(object sender, DataEventArgs e)
{
    Console.WriteLine(#34;接收到WebSocket数据: {e.Buffer.Length} 字节");
    // 在这里处理接收到的WebSocket数据  
}

private static void OnWebSocketDataSent(object sender, DataEventArgs e)
{
    Console.WriteLine(#34;发送WebSocket数据: {e.Buffer.Length} 字节");
    // 在这里处理发送的WebSocket数据  
}

性能优化

对于高流量场景,可以考虑以下优化:

异步处理:

private static async Task OnRequest(object sender, SessionEventArgs e)
{
    // 对于耗时操作,使用Task.Run来避免阻塞
    await Task.Run(async () =>
    {
        // 执行耗时操作
        await SomeTimeConsumingOperation();
    });
}

选择性拦截:

private static Task OnRequest(object sender, SessionEventArgs e)
{
    // 只拦截特定域名的请求
    if (e.HttpClient.Request.RequestUri.Host.Contains("example.com"))
    {
        // 执行拦截逻辑
    }
    else
    {
        // 对于其他请求,直接放行
    }
    return Task.CompletedTask;
}

最佳实践和注意事项

  1. 证书管理: 在生产环境中,确保使用受信任的根证书,并妥善管理。
  2. 错误处理: 实现全面的错误处理,以防止单个请求的失败影响整个代理服务器。
private static async Task OnRequest(object sender, SessionEventArgs e)
{
    try
    {
        // 处理请求
    }
    catch (Exception ex)
    {
        Console.WriteLine(#34;处理请求时发生错误: {ex.Message}");
        // 可以选择让请求继续,或者返回一个错误响应
        e.Ok();
    }
}
  1. 资源管理: 正确释放资源,特别是在处理大文件时。
  2. 隐私和合规性: 确保你有合法权利拦截流量,并遵守相关的数据保护法规。
  3. 性能监控: 实现性能监控,以便及时发现和解决瓶颈。
proxyServer.OnServerConnectionCreate+= OnServerConnectionCreate;

private static void OnServerConnectionCreate(object sender, Socket e)
{
    Console.WriteLine(#34;创建新连接,当前连接数: {proxyServer.ClientConnectionCount}");
}

通过遵循这些最佳实践和注意事项,你可以构建一个强大、高效且可靠的HTTP拦截系统。记住,拦截HTTP流量是一个强大的功能,应该谨慎使用,并始终考虑到安全性和隐私问题。

原文链接:,转发请注明来源!