2012-03-11 3 views
3

PHP로 코드를 작성하고 있는데 클라이언트의 IP 주소를 감지하고 싶습니다. $ _SERVER [ 'REMOTE_ADDR']을 (를) 사용하고 있습니다.브라우저가 사용자 IP 주소를 보호합니까?

일반적으로 작동하지만 ... 가끔은 일반 인터넷 연결을 사용하는 사용자가 웹 사이트에 연결하려고 시도했을 때 127.255.255.255라는 주소가 나타납니다. 그 이유가 있을까요?

+0

어떤 웹 서버를 실행하고 있습니까? –

+0

저는 실제로 확실하지 않습니다. webhubhosting.com을 사용하고 있습니다. – user1255714

+1

프록시를 사용하고 있는지, 그리고 클라이언트의 원격 주소로 브로드 캐스트 주소 (127.255.255.255)를 가져올 수 있는지 확인해야합니다. 다른 사용자가 말했듯이, REMOTE_ADDR 변수는 요청을받는 IP 주소를 사용하여 PHP 스크립트를 실행하는 웹 서버에 의해 설정됩니다. –

답변

3

127.255.255.255는 내부 서버 (루프백)에서 방송

는, 당신이 당신의 위치에 code injection 가능성을 확인해야 외부 사용자의 사용자 확인하는 경우입니다.

+0

하지만 일부 주소와 다른 주소에서는 작동하지 않는 이유는 무엇입니까? 이상하다. – user1255714

+0

'[P]'플래그를 사용하여'.htaccess' 파일에 RewriteRules이 있습니까? 당신은 어떤 페이지를 스스로 프록시 할 수도 있습니까? –

0

제목에있는 질문에 대답하려면 : REMOTE_ADDR은 해당 웹 서버에서 설정하며 사용자가 수정할 수 없습니다 (프록시 등 사용 제외). HTTP가 발생하기 전에 들어오는 TCP 연결로부터 결정됩니다.

그러나 서버 네트워크의 일부 방화벽이나 프록시는 난독화할 수 있습니다.

또한 127.255.255.255는 브로드 캐스트 주소이며 HTTP 연결 (유니 캐스트 인 TCP 임)의 소스가되어서는 안됩니다.

0

문제가 원하는 곳이 아닙니다. 실제로 inet_aton을 사용하여 mysql에 $_SERVER['REMOTE_ADDR']을 저장할 때 열이 int (11) unsigned으로 정의되어 있는지 확인해야합니다.

열이 부호가있는 int 인 경우 데이터가 잘리고 127.255.255.255보다 큰 모든 IP 주소는 그대로 저장됩니다.

당신은 당신의 MySQL의 테이블이 쿼리 (테이블 및 열 이름을 변경)를 실행해야합니다

ALTER TABLE `stats` CHANGE `ip` `ip` INT(11) UNSIGNED; 
1

문제는 ip2long가 4294967295로 대규모로 숫자를 반환하는 것입니다을 (255.255.255.255 용) 및 INT MySQL 필드 (서명 된 경우)가 최대 값 2147483647 (소스 : http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)을 허용하므로 2147483647보다 높은 값은 2147483647로 저장됩니다. 따라서 데이터베이스에 127.255.255.255가 많이있는 것입니다.

데이터베이스 열을 BIGINT 또는 부호없는 INT로 변환하면 문제가 해결되지만 ip2long()의 일부 구현 (32 비트 대 64 비트)이 음수를 반환한다는 것을 알고 있어야합니다. 꼼꼼한.

관련 문제