আমি জানি $ _SERVER এর আধিক্য রয়েছে আইপি ঠিকানা পুনরুদ্ধারের জন্য উপলব্ধ ভেরিয়েবলের শিরোনামের । আমি ভাবছিলাম যে কোনও ব্যবহারকারীর আসল আইপি অ্যাড্রেসটি কীভাবে সঠিকভাবে পুনরুদ্ধার করতে হবে (সাধারণ কোনও পদ্ধতি নিখুঁতভাবে জেনে নেই) বলেন ভেরিয়েবলগুলি ব্যবহার করে কীভাবে একটি সাধারণ sensক্যমত্য আছে?
গভীরতার সমাধান খুঁজতে চেষ্টা করে আমি কিছুটা সময় ব্যয় করেছি এবং বেশ কয়েকটি উত্সের ভিত্তিতে নিম্নলিখিত কোডটি নিয়ে এসেছি। যদি কেউ দয়া করে উত্তরের গর্তগুলি ছুঁড়ে দিতে পারে বা আরও সঠিক কোনও বিষয়ে কিছুটা আলোকপাত করতে পারে তবে আমি এটি পছন্দ করব।
সম্পাদনায় @ অ্যালিক্স থেকে অপ্টিমাইজেশন অন্তর্ভুক্ত রয়েছে
/**
* Retrieves the best guess of the client's actual IP address.
* Takes into account numerous HTTP proxy headers due to variations
* in how different ISPs handle IP addresses in headers between hops.
*/
public function get_ip_address() {
// Check for shared internet/ISP IP
if (!empty($_SERVER['HTTP_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_CLIENT_IP']))
return $_SERVER['HTTP_CLIENT_IP'];
// Check for IPs passing through proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// Check if multiple IP addresses exist in var
$iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($iplist as $ip) {
if ($this->validate_ip($ip))
return $ip;
}
}
}
if (!empty($_SERVER['HTTP_X_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_X_FORWARDED']))
return $_SERVER['HTTP_X_FORWARDED'];
if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
return $_SERVER['HTTP_FORWARDED_FOR'];
if (!empty($_SERVER['HTTP_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_FORWARDED']))
return $_SERVER['HTTP_FORWARDED'];
// Return unreliable IP address since all else failed
return $_SERVER['REMOTE_ADDR'];
}
/**
* Ensures an IP address is both a valid IP address and does not fall within
* a private network range.
*
* @access public
* @param string $ip
*/
public function validate_ip($ip) {
if (filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 |
FILTER_FLAG_IPV6 |
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE) === false)
return false;
self::$ip = $ip;
return true;
}
সতর্কতার শব্দ (আপডেট)
REMOTE_ADDR
এখনও একটি আইপি ঠিকানার সবচেয়ে নির্ভরযোগ্য উত্স প্রতিনিধিত্ব করে । $_SERVER
এখানে উল্লিখিত অন্যান্য ভেরিয়েবলগুলি খুব সহজেই একটি দূরবর্তী ক্লায়েন্টের দ্বারা ছদ্মবেশী হতে পারে। এই সমাধানের উদ্দেশ্য হ'ল প্রক্সিটির পিছনে বসে থাকা কোনও ক্লায়েন্টের আইপি ঠিকানা নির্ধারণের চেষ্টা করা। আপনার সাধারণ উদ্দেশ্যে, আপনি সরাসরি থেকে ফিরে আসা আইপি ঠিকানার সাথে এটি ব্যবহার করে বিবেচনা করতে পারেন$_SERVER['REMOTE_ADDR']
এবং উভয়ই সঞ্চয় করে বিবেচনা করতে পারেন।
99.9% ব্যবহারকারীর জন্য এই সমাধানটি আপনার প্রয়োজনগুলির জন্য উপযুক্ত হবে suit এটি আপনাকে আপনার নিজের অনুরোধ শিরোনাম ইনজেকশন দিয়ে আপনার সিস্টেমের অপব্যবহার করতে দেখা 0.1% দূষিত ব্যবহারকারীদের হাত থেকে রক্ষা করবে না। যদি REMOTE_ADDR
কোনও গুরুত্বপূর্ণ বিষয় মিশনের জন্য আইপি ঠিকানার উপর নির্ভর করে, তবে কোনও প্রক্সিটির পিছনে থাকা লোকদের কেটারিং বিরক্ত করবেন না।