2010-11-23 2 views
2

사실 이것은 두 부분으로 된 질문입니다.사용자 IP 및 양식 IP 유효성 확인 : ip2long을 사용해야합니까?

첫째, ip2long은 IP 유효성 검사기입니까? 누군가가 양식에 IP를 삽입하고 그것이 올바른지 확인하고자한다고 가정합니다. ip2long이 FALSE를 반환하지 않는지 확인하는 것이 좋습니까?

둘째 : 방문자의 IP를 확인하고 그것이 유효한 IP가 아닌 경우 액세스를 거부하는 것에 대해 어떻게 생각합니까? 내 방문자의 ips를 보면 가끔은 "1.1 Tiburon"과 같은 것을 발견합니다. 나는 '스푸핑 된 ip'라는 표현을 들었다. 스팸 봇과 관련이 있습니까?

+0

데이터 소스 란 무엇입니까? 아파치 액세스 로그? – stillstanding

+0

$ _SERVER에서 ip를 가져 와서 mysql 데이터베이스에 저장했습니다. – HappyDeveloper

답변

0

유효성 검증이 원하는 방법 철저한에 따라 다름을 알 수 없습니다. 올바른 형식의 IP 주소를 확인하는 간단한 방법은 /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ 행의 정규식입니다. (실제로, SubniC의 정규 표현식은 아마도 훨씬 낫습니다.) 이것은 당신의 1.1을 잡을 것입니다. 그것이 잘 형성되지 않았기 때문에 TIBURON 항목.

ip2long이 이것을 검사하는지 또는 IP처럼 보이지 않는 문자열의 부분을 무시하는지 확실하지 않습니다. 더 당신이 등 127.0.0.1, 255.255.255.255, 또한 의심스러운 네트워크의 요청을 필터링하기 위해 블랙리스트를 추가 할 수 있습니다

으로 IP 주소와 범위를 '예약'차단할 수

한 걸음, 또는 과거에 문제가 있었던 고객으로부터

처음 엔 그 항목이 어떻게 도착했는지 궁금합니다. 침입자가 기본 OS 또는 적어도 아파치를 손상시키지 않는 한 공격자가이 값을 $ _SERVER [ 'REMOTE_ADDR']에 가져올 수 없어야합니다. (또는 실행중인 웹 서버).

자바 스크립트를 사용하여 클라이언트의 IP를 읽지 못했습니까?

+0

아니요. PHP 만 사용하고 있습니다. 다른 $ _SERVER 옵션에서 ip를 잡아내는 함수를 사용하고있었습니다. 나는 보안에 대해 많이 알지 못한다.하지만 나는 유료 호스트 (godaddy)를 사용하고 있었기 때문에 문제가 아닌 것으로 짐작된다. ip2long은 "1.1 tiburon"에 대해 false를 반환하지만 "1.1"로 전달합니다. 1.1은 유효한 ip입니까? – HappyDeveloper

+0

1.1은 유효하지 않지만 ip2long은 여기에 관대하고 0.0.1.1로 해석합니다. 아파치의 액세스 로그 파일에 액세스 할 수 있습니까? 그것들은 무엇이든지간에 당신에게 실제 IP를 주어야합니다. – tdammers

+0

아, 알겠습니다. 그 순간 나는 그것에 접근 할 수 없었습니다. 지금 내가하는 일이 다시 일어 났길 바랍니다. – HappyDeveloper

1

IP 주소가 올바른지 확인해야한다면 다음과 같은 정규 표현식을 사용할 수 있습니다.

편집 :

if (preg_match('/\A(?:^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)\Z/im', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

당신은 당신이 활성화 된 경우 발견하기 위해 IP에 ping을 할 수있는 더 가고 싶은 경우. 두 번째 질문에 대해

, 내가, 내가 "1.1 티뷰론"일을 본 적이 없어, 무슨 말을

HTH

+0

핑 소리 내기는 좋은 생각이라고 생각하지 않습니다. 많은 라우터/방화벽은 핑에 응답하지 않으며 보안 조치로 인바운드 핑을 차단합니다. 핑 (ping)을 할 수 없다고해서 그것이 존재하지 않는다는 것을 의미하지는 않습니다. – tdammers

+0

정규 표현식이 작동하지 않는다면 "구분 기호는 영숫자 또는 백 슬래시가 아니어야합니다"라고 표시됩니다. \ b에 대한 무엇입니까? – HappyDeveloper

+0

안녕하세요, \ b는 단어 경계를 나타내며 IP는 한 단어 (공백 없음)에 있어야하며 새로운 것을 시도하십시오. – SubniC

0

나는이 코드를 가지고있다. 그것은 잠시 였고 그 뒤에있는 결정들을 꽤 기억할 수는 없지만 철저히 테스트를 거쳤 음을 확신합니다.
(실제로 변수를 변경하고 주석을 추가하기 때문에 약간 변형되었습니다. 그것 :

get_ip_addris_private_ip_addr 기능을 유용하게 찾을 수 있습니다.
get_ip_addr은 IP 주소 또는 호스트 이름을 모두 사용할 수 있습니다.

<?php 

function get_ip_addr($host){ 
    $long_ipaddr = my_ip2long($host); 
    $host = trim($host); 
    if($long_ipaddr !== false){ 
     $str_ip = long2ip($long_ipaddr); // Because of e.g. 245.254.245 
     return $str_ip; 
    } 

    $ip_addr = @gethostbyname($host); 
    if($ip_addr and $ip_addr != -1 ){ 
     return $ip_addr; 
    } 

    return false; 
} 

function my_ip2long($ipaddr){ 
    $long_ip = ip2long($ipaddr); 
    if($long_ip === false){ 
     return false; 
    } 

    // http://php.net/manual/en/function.ip2long.php says: 
    // Note: 
    // Because PHP's integer type is signed, and many IP addresses 
    // will result in negative integers, you need to use 
    // the "%u" formatter of sprintf() or printf() to get 
    // the string representation of the unsigned IP address. 
    $long_ip = sprintf("%u", $long_ip); 
    return $long_ip; 
} 

function ip2bin($ip){ 
    $octets = explode(".", $ip); 
    foreach($octets as $k => $v){ 
     $octets[$k] = str_pad(decbin($v), 8, "0", STR_PAD_LEFT); 
    } 
    return implode('', $octets); 
} 

function ip_in_range($ip, $prefix, $mask_len){ 
    $ip = ip2bin($ip); 
    $prefix = ip2bin($prefix); 

    $ip = substr($ip, 0, $mask_len); 
    $prefix = substr($prefix, 0, $mask_len); 

    // Watch out! Two numerical strings are converted to integers 
    // when you use ==. This is trouble for long integers. 
    // Using === skips this behaviour 
    return ($ip === $prefix); 
} 


function is_private_ip_addr($ipaddr){ 
    if("localhost" === $ipaddr) return true; 

    $long_ipaddr = my_ip2long($ipaddr); 
    if($long_ipaddr === false){ 
     return false; // Shouldn't be calling this! 
    } 
    // Info below obtained from http://bugs.php.net/bug.php?id=47435#c145655 
    // Not sure why 127.0.0.0/8 isn't mentioned ...? 
    // Also, in IPv6 there's the multicast address range: ff00::/8s 
    // 
    //  IPv4 private ranges 
    //  10.0.0.0/8  // private use network (rfc1918) 
    //  172.16.0.0/12 // private use network (rfc1918) 
    //  192.168.0.0/16 // private use network (rfc1918) 
    // 
    //  IPv4 reserved ranges 
    //  0.0.0.0/8  // "this" network (rfc1700) 
    //  169.254.0.0/16 // link local network (rfc3927) 
    //  192.0.2.0/24 // test net (rfc3330) 
    //  224.0.0.0/4 // Multicast (rfc3171) 
    //  240.0.0.0/4 // Reserved for Future Use (rfc1700) 
    // 
    //  IPv6 Private range 
    //  fc00::/7  // unique-local addresses (rfc4193) 
    //  
    //  IPv6 Reserved ranges 
    //  ::/128   // unspecified address (rfc4291) 
    //  ::1/128  // loopback address (rfc4291) 
    //  fe80::/10  // link local unicast (rfc4291) 
    //  2001:db8::/32 // documentation addresses (rfc3849) 
    //  5f00::/8  // 6Bone 
    //  3ffe::/16  // 6Bone 
    //  ::ffff:0:0/96 // IPv4-Mapped addresses (rfc4291) 
    //  2001:10::/28 // ORCHID addresses (rfc4843) 
    //  ::/0   // default unicast route address 
    // 
    // Anyways, this are the relevant RFCs: 
    // RFC 3330 (Sep 2002), "Special-Use IPv4 Addresses": 
    //        see section 3 for a nice table 
    // RFC 5156 (Apr 2008), "Special-Use IPv6 Addresses" 
    // 

    // Also, this function currently only deals with IPv4 addresses, 
    // since PHP's ip2long simply doesn't support IPv6 anyway. 
    // You can't currently even trust long ints to have 64 bit, 
    // so a 128 bit long int is out of the question. 

    if(ip_in_range($ipaddr, "127.0.0.0", 8)) return true; // Loopback 
    if(ip_in_range($ipaddr, "10.0.0.0", 8)) return true; // Private addresses (Class A range) 
    if(ip_in_range($ipaddr, "172.16.0.0", 12)) return true; // Private addresses (Class B range) 
    if(ip_in_range($ipaddr, "192.168.0.0", 16)) return true; // Private addresses (Class C range) 
    if(ip_in_range($ipaddr, "169.254.0.0", 16)) return true; // "This" network 
    if(ip_in_range($ipaddr, "192.0.2.0", 24)) return true; // "TEST-NET" (documentation and examples) 
    if(ip_in_range($ipaddr, "224.0.0.0", 4)) return true; // Multicast 
    if(ip_in_range($ipaddr, "240.0.2.0", 4)) return true; // Reserved for future use 

    return false; 
} 

허용되는 코드는 CC BY-SA입니다.
원하는대로 하시되, 향상 시키면 여기에 대해 알려주십시오.
이 게시물 커뮤니티 위키를 표시하고 있습니다 ..

+0

감사합니다. =). – HappyDeveloper