2013-02-16 4 views
1

저는 fuzzer (웹 애플리케이션 보안 도구)를 만들고 있는데 프록시 서버를 구축하는 데 문제가 있습니다. 아래 코드는 char* http 메시지를 취하고 ascii로 된 호스트 이름을 IP 주소로 변환 한 다음 해당 호스트와의 연결을 설정하여 요청을 전달하는 기능입니다. 그런 다음 응답을 수신하여 클라이언트로 다시 보냅니다.HTTP 응답의 크기를 C로 얻으십시오

나는 Boost 라이브러리를 사용하여 C++에서이 작업을 수행했지만 실제로하고있는 일을 제어하려고하므로 C로 작성하기로했다. 내가 직면하고있는 문제는 전체 응답이 다시 돌아 오므로 http 요청의 컨텐트 부분이 클라이언트로 다시 보내지지 않습니다. 어떤 길이의 요청을 처리 할 수 ​​있도록 응답 문자열을 얼마나 크게해야합니까? 엄청나게 큰 문자열 크기를 설정하는 것보다 더 좋은 방법이 있을까요?

약간의 연구를했는데 getaddrinfo은 요청을하는 것까지 갈 수있는 방법이지만 매우 익숙하지는 않습니다. 나는 또한 말한다이 오류를 얻을 :

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

내가 원래 내가 문자열에 null 종결을위한 공간을 만들기되지 않았기 때문에 그것이라고 생각을하지만 그게 문제가되지 않는 것 같다. 또한

당신이 다른 어떤 뻔뻔스러운 버그 나 문제를 볼 경우,

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; 

답변

2

음을들을 지적 주시기 바랍니다, HTTP 요청은 현실적으로 헤더의 예를 들어 엄청난 수 (어떤 크기 일 수있다 또는 게시 된 양식 데이터). 하나의 큰 문자열에 모든 것을 정말로 필요로한다면, 그것을 덩어리로 읽어야하고, 버퍼를 모두 포함하기 위해 필요하다면 realloc 버퍼를 읽어야 할 것이다.

HTTP 요청에도 NUL 문자가 포함 된 이진 데이터가 포함될 수 있습니다. 그래서 여러분은 여러분의 버퍼와 함께 길이를 리턴해야만 안전하게 NUL을 처리 할 수 ​​있습니다.

응답을 저장하지 않고 구문 분석하기 만하면 각 청크를 읽는 동안 응답을 점진적으로 분석 할 수 있습니다. 그렇게하면 전체 응답을 메모리에 저장할 필요가 없습니다.

+0

좋아, 그렇다면 내가 읽을 때까지 유효하고, null이 될 때까지 계속 할 수 있습니다. 간단한 루프가이를 처리 할 것입니다. 나는 전체 요청을 읽은 후에 -1과 비슷한 것을 반환한다고 가정합니다. – barndog

+1

'read'는 완료되면 0을 반환합니다. read (소켓 단절, 입출력 에러 등) 중에 문제가 생기면 -1 만 리턴한다. 'read'로 에러를 체크해야합니다 : 원격 엔드가 추락했다는 것을 나타낼 수 있습니다. 게다가'reslen'이 -1로 끝나면 정의되지 않은 동작 인'response [-1]'을 덮어 씁니다. – nneonneo

+0

굉장한, 알아두면 좋은. 맨 페이지를 볼 시간을 절약 해주었습니다. – barndog

관련 문제