C (+ 소켓) 433 429 280 276 270 259 바이트
#define H"medalbot.com"
char**p,B[999],*b=B;main(f){connect(f=socket(2,1,getaddrinfo("www."H,"80",0,&p)),p[4],16);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);read(f,b,998);for(f=3;f--;puts(p))b=strchr(p=strstr(++b,"_n")+9,34),*b=0;}
따라서 C는 인터넷에서 리소스를 다운로드하고 JSON으로 구문 분석하는 데 좋지 않습니다. 누가 알았 겠어?
내 생각 때문에 medalbot.com 트리거 버퍼 오버 플로우 등을 그들이 할 수있을 것 악의적 인 데이터를 전송하기를 원한다면이 코드는 또한 최신 코드가 기대하는, 오류 검사와 (자연) 슈퍼 느슨한 인 상수에 대한 특정 값 (예를 들어 AF_INET = 2
)하는 아마도 모든 곳에서 일어날 수 있지만 보장되지는 않습니다.
깨지기 쉽지 않은 원래 코드는 다음과 같습니다 (그러나 여전히 강력하거나 안전하지는 않습니다).
#include<netdb.h>
#define H"medalbot.com"
char*b,*B,d[999];struct addrinfo*p,h;main(f){h.ai_socktype=SOCK_STREAM;getaddrinfo("www."H,"80",&h,&p);f=socket(p->ai_family,p->ai_socktype,p->ai_protocol);connect(f,p->ai_addr,p->ai_addrlen);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost: "H":80\r\nConnection: close\r\n\r\n",92,0);recv(f,d,998,0);for(f=0,b=d;f<3;++f)B=strstr(b,"_n")+9,b=strchr(B,'}'),*strchr(B,'"')=0,puts(B);}
고장:
// No imports needed whatsoever!
#define H"medalbot.com" // Re-use the host in multiple places
char**p, // This is actually a "struct addrinfo*"
B[999], // The download buffer (global to init with 0)
*b=B; // A mutable pointer to the buffer
main(f){
// Hope for the best: try the first suggested address with no fallback:
// (medalbot.com runs on Heroku which has dynamic IPs, so we must look up the
// IP each time using getaddrinfo)
f=socket(2,1,getaddrinfo("www."H,"80",0,&p));
// 2 = AF_INET
// 1 = SOCK_STREAM
// (may not match getaddrinfo, but works anyway)
// 0 = IP protocol (getaddrinfo returns 0 on success)
connect(f,p[4],16); // struct addrinfo contains a "struct sockaddr" pointer
// which is aligned at 32 bytes (4*8)
// Send the HTTP request (not quite standard, but works. 69 bytes long)
send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);
// (omit flags arg in send and hope 0 will be assumed)
read(f,b,998); // Get first 998 bytes of response; same as recv(...,0)
// Loop through the top 3 & print country names:
// (p is re-used as a char* now)
for(f=3;f--;puts(p)) // Loop and print:
p=strstr(++b,"_n")+9, // Find "country_name": "
b=strchr(p,34), // Jump to closing "
*b=0; // Set the closing " to \0
}
Connection: close\r\n
HTTP 요청의 일부로 보내지 않기 때문에 서버에는 좋지 않습니다 . Accept
medalbot.com은 압축을 사용하지 않는 것처럼 보이기 때문에 헤더를 생략하고 공백을 놓칩니다 Host:
(다시 말하면 서버는 이것으로 괜찮습니다). 그래도 다른 것을 제거 할 수있는 것처럼 보이지 않습니다.
올림픽이 끝나면이 프로그램에서 가장 가능성이 높은 동작은 segfault가 메모리 위치 9를 읽으려고 시도하는 것입니다. 사악한 해커가 도메인을 인계하지 않는 한, 가장 가능성이 높은 동작은 주소에서 바이트를 0으로 설정하는 것입니다. info 구조체는 실제로 그렇게 위험하지는 않습니다. 그러나 누가이 사악한 해커들에게 말할 수 있습니까?