저는 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;
좋아, 그렇다면 내가 읽을 때까지 유효하고, null이 될 때까지 계속 할 수 있습니다. 간단한 루프가이를 처리 할 것입니다. 나는 전체 요청을 읽은 후에 -1과 비슷한 것을 반환한다고 가정합니다. – barndog
'read'는 완료되면 0을 반환합니다. read (소켓 단절, 입출력 에러 등) 중에 문제가 생기면 -1 만 리턴한다. 'read'로 에러를 체크해야합니다 : 원격 엔드가 추락했다는 것을 나타낼 수 있습니다. 게다가'reslen'이 -1로 끝나면 정의되지 않은 동작 인'response [-1]'을 덮어 씁니다. – nneonneo
굉장한, 알아두면 좋은. 맨 페이지를 볼 시간을 절약 해주었습니다. – barndog