You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web URL过滤开发求助:HTTP代理实现及HTTPS扩展指导

Web URL过滤方案开发技术指导请求

项目背景与实现思路

  • 承接教授的Web URL过滤方案开发任务,构思了两种实现思路:
    • 客户端方向:通过TCP连接重置攻击终止本机与封禁IP/URL的TCP连接
    • 中间代理方向:部署代理服务器,在数据包到达目标服务器前拦截所有请求

当前进展与待解决问题

作为网络领域新手,已完成HTTP代理的基础版本(代码如下),但不知如何进一步推进,尤其HTTPS过滤因加密机制导致难度提升,恳请技术指导。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PROXY_PORT 8080
#define BLACKLISTED_URL "example.net"

void handle_client(int client_socket) {
    char request[4096];
    ssize_t bytes_received;

    // Receive the client's request
    bytes_received = recv(client_socket, request, sizeof(request), 0);

    // printf("Received request: %s\n", request);

    if (bytes_received < 0) {
        perror("Error receiving request");
        return;
    }

    // Check if the request contains a blacklisted URL
    if (strstr(request, BLACKLISTED_URL) != NULL) {
        const char* response = "HTTP/1.1 403 Forbidden\r\nContent-Length: 19\r\n\r\nAccess Denied: URL blocked\r\n";
        send(client_socket, response, strlen(response), 0);
        close(client_socket);
        return;
    }

    // Create a connection to the target server
    int target_socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in target_addr;
    target_addr.sin_family = AF_INET;
    target_addr.sin_port = htons(80);
    target_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (connect(target_socket, (struct sockaddr*)&target_addr, sizeof(target_addr)) < 0) {
        perror("Error connecting to the target server");
        close(client_socket);
        return;
    }

    // Forward the request to the target server
    send(target_socket, request, bytes_received, 0);

    // Forward the response from the target server to the client
    char response_buffer[4096];
    ssize_t bytes_sent;
    while ((bytes_received = recv(target_socket, response_buffer, sizeof(response_buffer), 0)) > 0) {
        bytes_sent = send(client_socket, response_buffer, bytes_received, 0);
        if (bytes_sent < 0) {
            perror("Error sending response to the client");
            break;
        }
    }

    // Close the sockets
    close(client_socket);
    close(target_socket);
}

int main() {
    int proxy_socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in proxy_addr;
    proxy_addr.sin_family = AF_INET;
    proxy_addr.sin_port = htons(PROXY_PORT);
    proxy_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(proxy_socket, (struct sockaddr*)&proxy_addr, sizeof(proxy_addr)) < 0) {
        perror("Error binding to the proxy port");
        return 1;
    }

    if (listen(proxy_socket, 10) < 0) {
        perror("Error listening on the proxy socket");
        return 1;
    }

    printf("Proxy server listening on port %d...\n", PROXY_PORT);

    while (1) {
        struct sockaddr_in client_addr;
        socklen_t client_addr_len = sizeof(client_addr);
        int client_socket = accept(proxy_socket, (struct sockaddr*)&client_addr, &client_addr_len);

        if (client_socket < 0) {
            perror("Error accepting client connection");
        } else {
            handle_client(client_socket);
        }
    }

    close(proxy_socket);
    return 0;
}

内容的提问来源于stack exchange,提问作者MT 16

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:25:07