소스보기입니다.
IP가 127.0.0.1이 되었을 때 solve()함수가 호출되네요 ~
이를 해결하는게 이번문제인 것 같습니다.
그럼 소스를 분석해보겠습니다.
extract($_SERVER);
extract($_COOKIE);
$ip = $REMOTE_ADDR;
$agent = $HTTP_USER_AGENT;
여기서 핵심은 extract()함수입니다.
extract를 간단히 설명하자면 $_SERVER[REMOTE_ADDR] 은 접속자 IP정보가 담긴 변수입니다.
이를 extract($_SERVER); 와 같은 방식으로 사용하면 REMOTE_ADDR = IP정보와 같은이 변수와 값을를 할당해줍니다.
즉, "키=값"이 있을 때 키를 변수로 사용할 수 있도록 해주는 방식입니다.
"$_SERVER"안에는 REMOTE_ADDR이라는 속성과 그에 해당하는 키값이 있기 때문에 자동적으로
REMOTE_ADDR이라는 변수가 생성됩니다.
또한 extract($_COOKIE)를 하여 쿠키안에 키과 그값에 해당하는 변수를 생성하게 됩니다.
저 같은경우 "PHPSESSID=e3sq41v6a013slvs1caipgnli5" 이처럼 값이 할당되겠네요.
if($REMOTE_ADDR){
$ip = htmlspecialchars($REMOTE_ADDR);
$ip = str_replace("..",".",$ip);
$ip = str_replace("12","",$ip);
$ip = str_replace("7.","",$ip);
$ip = str_replace("0.","",$ip);
}
이 부분의 경우 추출한 IP를 replace()를 통해 값을 변경하고 있습니다.
".."를 "." 로 바꾸고 "12","7.","0."은 값을 지워 버립니다.
이를 토대로 출력 결과물이 "127.0.0.1"이 되려면 "112277...00...00...1"이 되어야 합니다.
그럼 이 값을 어떻게 $REMOTE_ADDR 변수에 넣을지 생각해보면 해답은 extract($_COOKIE)에 있습니다.
extract($_SERVER); 을 하면 REMOTE_ADDR = [공인IP] 처럼 할당 되게 됩니다.
이를 덮어 쓰기 위해 미리 "REMOTE_ADDR"이라는 이름으로 쿠키를 생성하고 "112277...00...00...1"값을 넣어놓으면 extract($_COOKIE); 함수가 호출되는 순간 변수 이름이 중복되므로 [공인IP] 값을 "112277...00...00...1"로 덮어 쓰게 됩니다.
[덮어쓰기 테스트]