दिलचस्प पोस्ट
उल्कास द्वारा लोड सीएसएस और जेएस फाइलों का क्रम लिबिटिफ का उपयोग सी # से (टाइल वाली TIFF छवियों तक पहुंचने के लिए) कैसे multimarkdown में एक नाम एंकर से लिंक करने के लिए? जावा के लिए पीडीएफ जेनरेशन लाइब्रेरी स्थानीय चर में प्रारंभिक मान क्यों होना चाहिए डीएनएक्स प्रक्रिया की प्रक्रिया आईडी को निर्धारित करने का प्रयास करते हुए एक त्रुटि हुई, जो आपके आवेदन की मेजबानी कर रहा है अक्षम फ़ील्ड सबमिट करें सी #: गतिशील रनटाइम डाली कंप्यूटर में सभी प्रिंटर की सूची कैसे प्राप्त करें पृष्ठभूमि कार्यकर्ता को तर्क भेजना? बाश को आह्वान करें, नए शेल के अंदर कमांड चलाएं, फिर उपयोगकर्ता को वापस नियंत्रण दें CancelBubble और stopPropagation के बीच अंतर क्या है? 'एप इंजन डाटास्टोर' में पायथन में एक इकाई की प्रतिलिपि बनाएँ, 'कंपाइल' समय पर संपत्ति के नामों को जानने के बिना दिनांक समय "शून्य" मान जावास्क्रिप्ट में सर्वश्रेष्ठ प्रदर्शन के साथ "लेवेनशैटेन दूरी" द्वारा एक सरणी क्रमित करें

आईपी ​​पते की जांच कैसे करें PHP में दो आईपी की एक सीमा के भीतर है?

मेरे पास एक आईपी पता है और मुझे दो अन्य आईपी पतों को दिया गया है जो एक आईपी रेंज को एक साथ बनाता है। मुझे यह देखना है कि पहले आईपी पता इस श्रेणी के भीतर है या नहीं। मैं PHP में कैसे पता कर सकता हूँ?

Solutions Collecting From Web of "आईपी ​​पते की जांच कैसे करें PHP में दो आईपी की एक सीमा के भीतर है?"

ip2long() साथ अपने पते को संख्याओं में परिवर्तित करना आसान है। इसके बाद, आपको यह जांचना होगा कि संख्या कितनी है:

 if ($ip <= $high_ip && $low_ip <= $ip) { echo "in range"; } 

यह वेबसाइट इस करने के लिए एक महान मार्गदर्शिका और कोड प्रदान करती है (जो इस प्रश्न के लिए Google खोज का पहला परिणाम था):

 <?php /* * ip_in_range.php - Function to determine if an IP is located in a * specific range as specified via several alternative * formats. * * Network ranges can be specified as: * 1. Wildcard format: 1.2.3.* * 2. CIDR format: 1.2.3/24 OR 1.2.3.4/255.255.255.0 * 3. Start-End IP format: 1.2.3.0-1.2.3.255 * * Return value BOOLEAN : ip_in_range($ip, $range); * * Copyright 2008: Paul Gregg <pgregg@pgregg.com> * 10 January 2008 * Version: 1.2 * * Source website: http://www.pgregg.com/projects/php/ip_in_range/ * Version 1.2 * * This software is Donationware - if you feel you have benefited from * the use of this tool then please consider a donation. The value of * which is entirely left up to your discretion. * http://www.pgregg.com/donate/ * * Please do not remove this header, or source attibution from this file. */ // decbin32 // In order to simplify working with IP addresses (in binary) and their // netmasks, it is easier to ensure that the binary strings are padded // with zeros out to 32 characters - IP addresses are 32 bit numbers Function decbin32 ($dec) { return str_pad(decbin($dec), 32, '0', STR_PAD_LEFT); } // ip_in_range // This function takes 2 arguments, an IP address and a "range" in several // different formats. // Network ranges can be specified as: // 1. Wildcard format: 1.2.3.* // 2. CIDR format: 1.2.3/24 OR 1.2.3.4/255.255.255.0 // 3. Start-End IP format: 1.2.3.0-1.2.3.255 // The function will return true if the supplied IP is within the range. // Note little validation is done on the range inputs - it expects you to // use one of the above 3 formats. Function ip_in_range($ip, $range) { if (strpos($range, '/') !== false) { // $range is in IP/NETMASK format list($range, $netmask) = explode('/', $range, 2); if (strpos($netmask, '.') !== false) { // $netmask is a 255.255.0.0 format $netmask = str_replace('*', '0', $netmask); $netmask_dec = ip2long($netmask); return ( (ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec) ); } else { // $netmask is a CIDR size block // fix the range argument $x = explode('.', $range); while(count($x)<4) $x[] = '0'; list($a,$b,$c,$d) = $x; $range = sprintf("%u.%u.%u.%u", empty($a)?'0':$a, empty($b)?'0':$b,empty($c)?'0':$c,empty($d)?'0':$d); $range_dec = ip2long($range); $ip_dec = ip2long($ip); # Strategy 1 - Create the netmask with 'netmask' 1s and then fill it to 32 with 0s #$netmask_dec = bindec(str_pad('', $netmask, '1') . str_pad('', 32-$netmask, '0')); # Strategy 2 - Use math to create it $wildcard_dec = pow(2, (32-$netmask)) - 1; $netmask_dec = ~ $wildcard_dec; return (($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec)); } } else { // range might be 255.255.*.* or 1.2.3.0-1.2.3.255 if (strpos($range, '*') !==false) { // ab*.* format // Just convert to AB format by setting * to 0 for A and 255 for B $lower = str_replace('*', '0', $range); $upper = str_replace('*', '255', $range); $range = "$lower-$upper"; } if (strpos($range, '-')!==false) { // AB format list($lower, $upper) = explode('-', $range, 2); $lower_dec = (float)sprintf("%u",ip2long($lower)); $upper_dec = (float)sprintf("%u",ip2long($upper)); $ip_dec = (float)sprintf("%u",ip2long($ip)); return ( ($ip_dec>=$lower_dec) && ($ip_dec<=$upper_dec) ); } echo 'Range argument is not in 1.2.3.4/24 or 1.2.3.4/255.255.255.0 format'; return false; } } ?> 

मैंने इस छोटे से सार को पाया जो कि पहले से उल्लेख किया गया है उससे सरल / छोटे समाधान है

दूसरा तर्क (श्रेणी) या तो एक स्थिर आईपी हो सकता है जैसे कि 127.0.0.1 या 127.0.0.0/24 जैसी श्रेणी

 /** * Check if a given ip is in a network * @param string $ip IP to check in IPV4 format eg. 127.0.0.1 * @param string $range IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed * @return boolean true if the ip is in this range / false if not. */ function ip_in_range( $ip, $range ) { if ( strpos( $range, '/' ) == false ) { $range .= '/32'; } // $range is in IP/CIDR format eg 127.0.0.1/24 list( $range, $netmask ) = explode( '/', $range, 2 ); $range_decimal = ip2long( $range ); $ip_decimal = ip2long( $ip ); $wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1; $netmask_decimal = ~ $wildcard_decimal; return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) ); } 

मैं हमेशा ip2long का सुझाव दूंगा , लेकिन कभी-कभी आपको नेटवर्क्स और आदि की जांच करना होगा। मैंने पिछले एक आईपीवी 4 नेटवर्किंग क्लास में बनाया है, जो यहां हाईओएनएचएचपी पर पाया जा सकता है।

आईपी ​​पते के साथ काम करने के बारे में अच्छी बात यह है कि विशेष रूप से बिटविज़ ऑपरेटरों का उपयोग करते समय यह लचीलापन है एंडिंग, ओआरिंग और बिटशफ्टिंग एक जादू की तरह काम करेंगे।

 if(version_compare($low_ip, $ip) + version_compare($ip, $high_ip) === -2) { echo "in range"; } 

बीटीडब्ल्यू, यदि आपको कई श्रेणियों को एक बार चेक करना है, तो आप श्रेणियों की श्रेणी को पार करने के लिए कोड में कुछ पंक्तियां जोड़ सकते हैं। दूसरा तर्क एक सरणी या स्ट्रिंग हो सकता है:

 public static function ip_in_range($ip, $range) { if (is_array($range)) { foreach ($range as $r) { return self::ip_in_range($ip, $r); } } else { if ($ip === $range) { // in case you have passed a static IP, not a range return TRUE; } } // The rest of the code follows here.. // ......... } 

श्रेणी में तुलना करना (Ipv6 समर्थन शामिल करना)

निम्नलिखित दो फ़ंक्शंस PHP 5.1.0, inet_pton और inet_pton में पेश किए गए थे। उनका उद्देश्य मानव पठनीय आईपी पते को उनके पैक in_addr प्रतिनिधित्व में परिवर्तित करना है। चूंकि परिणाम शुद्ध बाइनरी नहीं है, इसलिए हमें बिटवार ऑपरेटर्स को लागू करने के लिए unpack फ़ंक्शन का उपयोग करने की आवश्यकता है।

दोनों कार्यों IPv6 के साथ-साथ IPv4 का समर्थन करते हैं। फर्क सिर्फ इतना है कि आप परिणामों से पता कैसे निकाल सकते हैं IPv6 के साथ, आप A16 के साथ सामग्री के साथ अनपैक करेंगे, और IPv4 के साथ, आप A4 से अनपैक करेंगे।

पिछली बार एक परिप्रेक्ष्य में इसे स्पष्ट करने में मदद करने के लिए थोड़ा सा नमूना आउटपुट दिया गया है:

 // Our Example IP's $ip4= "10.22.99.129"; $ip6= "fe80:1:2:3:a:bad:1dea:dad"; // ip2long examples var_dump( ip2long($ip4) ); // int(169239425) var_dump( ip2long($ip6) ); // bool(false) // inet_pton examples var_dump( inet_pton( $ip4 ) ); // string(4) var_dump( inet_pton( $ip6 ) ); // string(16) 

हम ऊपर दिखाते हैं कि inet_ * परिवार आईपीवी 6 और वी 4 दोनों का समर्थन करता है। हमारा अगला कदम पैक किए गए परिणाम को एक अनपेक्षित चर में अनुवाद करना होगा।

 // Unpacking and Packing $_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" 

नोट: वर्तमान फ़ंक्शन एक सरणी का पहला सूचकांक देता है। $ Array [0] कहने के लिए यह बराबर है

अनपैकिंग और पैकिंग के बाद, हम देख सकते हैं कि हम उसी परिणाम को इनपुट के रूप में हासिल कर चुके हैं। यह सुनिश्चित करने के लिए यह एक सरल अवधारणा है कि हम किसी भी डेटा को नहीं खो रहे हैं।

अंत में उपयोग,

 if ($ip <= $high_ip && $low_ip <= $ip) { echo "in range"; } 

संदर्भ: php.net