1

ファザー (Web アプリケーション セキュリティ ツール) を構築していますが、プロキシ サーバーの構築に問題があります。以下は、char*http メッセージを受け取り、ascii のホスト名を IP アドレスに変換し、そのホストとの接続を確立してリクエストを転送する関数のコードです。次に、応答を受け取り、それをクライアントに送り返します。

以前に Boost ライブラリを使用して C++ でこれを行ったことがありますが、実際に行っていることを制御したいので、これを C で記述することにしました。私が直面している問題は、応答全体が返されないことです。そのため、http リクエストのコンテンツ部分はクライアントに送り返されません。任意の長さのリクエストを処理できるようにするには、応答文字列をどのくらいの大きさにする必要がありますか? 文字列のサイズを途方もなく大きく設定するよりも良い方法はありますか?

私はいくつかの調査をgetaddrinfo行いましたが、リクエストを行う限り使用する方法のようですが、私はそれに慣れていません。次のようなエラーも表示されます。

malloc: *** error for object 0x7fb8a8c04fe8: incorrect checksum for freed object - object was probably modified after being freed.

私は当初、文字列にヌルターミネータのためのスペースを作っていなかったからだと思っていましたが、それは問題ではないようです。

また、他にも明らかなバグや問題がありましたら、遠慮なくご指摘ください。

int sock;
struct addrinfo hints, *res, *res0;
int error;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(hostname, "http", &hints, &res0);
if(error){
    puts("Error translating hostname");
    exit(1);
}
int reslen;
char* response = malloc(strlen(message)+1 * sizeof(char));
for(res = res0; res; res= res->ai_next){
    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if(sock < 0) puts("sock is < 0");
    if(connect(sock, res->ai_addr, res->ai_addrlen) < 0){
        fprintf(stderr, "Error connecting to %s\n", hostname);
    }
    write(sock, message, len);
    reslen = read(sock, response, kMaxMess);
    response[reslen] = '\0';
}
close(sock);
return response;
4

1 に答える 1

2

HTTP リクエストは現実的にはどのようなサイズでもかまいません (たとえば、膨大な数のヘッダーや投稿されたフォーム データなど)。すべてを 1 つの大きな文字列で本当に必要とする場合は、reallocすべてを格納するために、必要に応じてチャンクとバッファーで読み取る必要があります。

ただし、HTTP 要求には、NUL文字が埋め込まれたバイナリ データを含めることもできます。したがって、NUL を安全に処理できるように、バッファーと共に長さを返す必要があります。

または、応答を保存せずに解析する必要がある場合は、各チャンクを読み取りながら段階的に解析することを検討できます。そうすれば、応答全体をメモリに貼り付ける必要がなくなります。

于 2013-02-16T07:29:12.677 に答える