14-Mauvzu: Inet_pton, inet_ntop funksiyalari
Reja:
1. Php -da IPv4 bilan ishlash
2. IPv4 va IPv6 tekshiruvi
3. IPv6 konvertatsiyasi
Php -da IPv4 bilan ishlash juda oddiy edi, buning uchun ikkita ip2long va long2ip
funktsiyalari mavjud edi. Bu funktsiyalar IP -manzilni oddiy raqamga va aksincha tarjima qilishga
imkon berdi. Afsuski, IPv6 -da bu mumkin emas.
IPv4 manzili 32 bit bo'lib, ko'pchilik operatsion tizimlar va
dasturlash tillari mahalliy
qo'llab -quvvatlaydi. 32 va undan ko'p bitli platformalar 0 dan 4 294 967 295(yoki 2 32 , bu
tarmoqdagi IP -manzillarning maksimal soni) gacha bo'lgan raqamlarni qo'llab -quvvatlaydi . Bu
manzilni raqamga aylantirish imkonini berdi, bu esa o'z navbatida xotira va tizim resurslaridan
tejamli foydalanish imkonini berdi.
IPv6 - bu boshqa hikoya. Hozirgi vaqtda ko'pchilik kompyuterlar 64 bitli arxitekturadan
foydalanadi va 64 bitli OS bilan ishlaydi. 64 bitli platformada ruxsat berilgan eng katta
raqamlar 18 446 744 073 709 551 616(yoki 2 64 ). Ammo IPv6 o'lchovsiz ko'proq
manzillarga
ruxsat beradi - 340 282 366 920 938 463 463 374 607 431 770 000 000(yoki 2,128 ). Bu juda katta
raqam, va, afsuski, bu bilan ishlashda muammolarga olib keladi.
Ko'p sonli bitlar bilan ishlash hatto zamonaviy dasturlash tillari uchun ham qiyin va bunday
raqamlardagi xotira muammolari tufayli IPv6 -ni qo'llab -quvvatlash algoritmlari odatda noto'g'ri
bo'ladi.
Muallifdan eslatma: E'tibor bering: IPv6 -da translyatsiya manzillari yo'q. IPv4 -da
diapazonning oxirgi manzili translyatsiya uchun ajratilgan. IPv6 -da translyatsiya kontseptsiyasi
yo'q, aksincha u barcha tugunlarga mahalliy havolada "multicast" dan foydalanadi ff02::1.
IPv4 va IPv6 tekshiruvi.
Bu mumkin bo'lgan eng oddiy vazifa. Ba'zi dasturchilar strpos( $ip , ":")IPv6 ni aniqlash
va substr_count( $ip , ".") == 3IPv4 manzillarini tekshirish uchun konstruktsiyalardan
foydalanadilar .
Ammo bu tubdan noto'g'ri . Birinchidan, bunday tekshiruvlar xavfli emas,
chunki ular
osonlikcha chetlab o'tiladi. Va ikkinchidan, ular shunchaki noaniq. Masalan, bu funktsiyalar IPv4
formatida yozilgan IPv6 manzillarini, masalan, u ::127.0.0.1yoki bu kabi, to'g'ri ishlay
olmaydi ::ffff:10.10.1.1.
Php filter_varkiruvchi ma'lumotlarni tekshiradigan funktsiyaga ega. Bizning holatda, IP -
manzilni tekshirish uchun filtrdan foydalanish kerak FILTER_VALIDATE_IP. Va
versiyani
aniqlash uchun - bayroqlar FILTER_FLAG_IPV4yoki FILTER_FLAG_IPV6. Masalan:
PHP
1
2
3
4
5
6
7
if( filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ){
// Это валидный IPv4 адрес
}
if( filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ){
// Это валидный IPv6 адрес
}
Bu tekshirishning to'g'ri va xavfsiz usuli. IP -manzillarni shu tarzda tekshirishga arziydi,
agar siz o'z velosipedingizni yasashni xohlamasangiz. Aytgancha, filter_vartasdiqlash uchun
elektron pochta yoki URL kabi boshqa ko'plab ma'lumotlarni ishlatish yaxshi amaliyotdir .
IPv6
konvertatsiyasi
PHP 5.1 ikki foydali vazifalarni qo'shadi inet_ptonva inet_ntop. Bu funktsiyalar IP-
manzilning odam o'qiy oladigan tasvirini in_addr-paketli tasvirga aylantiradi va aksincha. Ijro
natijasi inet_ptonfaqat ikkilik bo'lmaganligi unpacksababli, kelajakda bitli operatsiyalar bilan
ishlash uchun funksiyadan foydalanish kerak .
Ikkala funktsiya ham IPv4 va IPv6 ni qo'llab -quvvatlaydi. Faqat
farq - natijani qanday
ochish kerak. Masalan, IPv6 uchun siz formatni A16, IPv4 uchun esa ishlatishingiz kerak A4.
Buni misol bilan ko'rib chiqaylik:
PHP
1
2
3
4
5
6
7
8
// Случайные Ip адреса для примера
$ip4= "10.22.99.129";
$ip6= "fe80:1:2:3:a:bad:1dea:dad";
// Пример с ip2long
var_dump( ip2long($ip4) ); // int(169239425)
var_dump( ip2long($ip6) ); // bool(false)
9
10
11
12
13
// Примре с inet_pton
var_dump( inet_pton( $ip4 ) ); // string(4) " c"
var_dump( inet_pton( $ip6 ) ); // string(16) "� �"
Ko'rib turganingizdek, u inet_ptonIPv4 va IPv6 ni qo'llab -quvvatlaydi. Keyingi qadam,
qadoqlangan natijani ochilmagan qiymatga aylantirishdir:
PHP
1
2
3
4
5
6
7
// Распаковываем и упаковываем
$_u4 = current( unpack( "A4", inet_pton( $ip4 ) ) );
var_dump( inet_ntop( pack( "A4", $_u4 ) ) ); // string(12) "10.22.99.129"
$_u6 = current( unpack( "A16", inet_pton( $ip6 ) ) );
var_dump(
inet_ntop(
pack(
"A16",
$_u6
)
)
);
//string(25)
"fe80:1:2:3:a:bad:1dea:dad"
Funksiya currentqatorning birinchi elementini qaytaradi$array[0]
Ochish va qadoqlashdan keyin ko'rib turganingizdek, biz avvalgi IP -manzilni ko'ramiz. Bu
shuni ko'rsatadiki, bu jarayonda ma'lumotlar yo'qolmaydi.
Tayyor funktsiyalar
Biz DRY yondashuvining ulkan tarafdorimiz. Dasturlashda DRY
yondashuvi, o'zingizni
takrorlamang. Tayyor funktsiyalar, sinflar va boshqalardan foydalanish QURUQ mafkurasining
yaxshi namunasidir. Natijada, biz sizning kodingizni
soddalashtirish uchun
tayyor funktsiyalar
to'plamini
tayyorladik .
Funktsiya dtr_ptonyuqorida tavsiflangan barcha mantiqni amalga oshiradi. U kirish
qiymatini tekshiradi, o'zgartirilgan qiymatni qaytaradi yoki xato bo'lsa, noto'g'ri / istisno:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* dtr_pton
*
* Converts a printable IP into
an unpacked binary string
*
* @author Mike Mackintosh - mike@bakeryphp.com
* @param string $ip
* @return string $bin
*/
function dtr_pton( $ip ){
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)){
return current( unpack( "A4", inet_pton( $ip ) ) );
}
elseif(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){
return current( unpack( "A16", inet_pton( $ip ) ) );
}
throw new \Exception("Please supply a valid IPv4 or IPv6 address");
}