Birisi IPv6 / IPv4 üzerinden bağlı olmadığını nasıl kontrol

5 Cevap php

Birisi IPv4 veya IPv6 üzerinden siteme bağlanır eğer php üzerinden kontrol etmek istiyorum.

Istemci adresi but nasıl IPv4 veya IPv6 olmadığını kontrol etmek için $ _SERVER ["REMOTE_ADDR"] bulunabilir?

Zaman ayırdığınız için teşekkür ederiz

Andre

5 Cevap

Bu kullanabilirsiniz:

function ipVersion($txt) {
     return strpos($txt, ":") === false ? 4 : 6;
}

Ne in '.' ve / veya ':' sayısını sayma $_SERVER["REMOTE_ADDR"]?

Hiçbir '.' sembolü orada fazla 0 ':' ise ve $_SERVER["REMOTE_ADDR"], ben kullanıcı IPv6 üzerinden bağlanır size düşünebilirsiniz varsayalım.


Another solution might be to use the filter extension : there are constants (see the end of the page) that seem to be related to IPv4 and IPv6 :

FILTER_FLAG_IPV4 (integer)
Allow only IPv4 address in "validate_ip" filter.

FILTER_FLAG_IPV6 (integer)
Allow only IPv6 address in "validate_ip" filter.

IPv4 tüm regex eşleşen adresleri /^\d{1,3}(\.\d{1,3}){3,3}$/.

İfadelerinin kullanarak yukarıdaki çözümler iyi - ama sunucu bile ilk etapta IPv6 destekleyip desteklemediğini kontrol etmeyi unutmayın! Birçok sistem yöneticileri bir sürü baş ağrısı neden olur, çünkü IPv6 kapattınız. (Birçok uygulama akılda IPv4 ile özel yazılmış).

En yüksek oyu cevabı oldukça önemli bir sorunu var, çünkü benim kendi paylaşmak için gidiyorum.

Bu IPv6 gibi görünen bir adres geçirilir ise true döndürür ve IPv4 (ya da IPv4 eşlenmiş IPv6) gibi görünen bir adres gerçek adresleri içeri geçti ise false fazla valide değildir; Eğer onları doğrulamak için gerekirse filter_var() kullanın.

function is_ipv6($address) {
    $ipv4_mapped_ipv6 = strpos($address, "::ffff:");
    return (strpos($address, ":") !== FALSE) &&
           ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0);
}