दूसरे शब्दों में, मैं कैसे बता सकता हूं कि मेरे वेब एप्लिकेशन का उपयोग करने वाला व्यक्ति उस सर्वर पर है, जिस पर वह रहता है? अगर मुझे सही से याद है, तो PHPMyAdmin सुरक्षा कारणों से ऐसा कुछ करता है।
दूसरे शब्दों में, मैं कैसे बता सकता हूं कि मेरे वेब एप्लिकेशन का उपयोग करने वाला व्यक्ति उस सर्वर पर है, जिस पर वह रहता है? अगर मुझे सही से याद है, तो PHPMyAdmin सुरक्षा कारणों से ऐसा कुछ करता है।
जवाबों:
आप यह भी उपयोग कर सकते हैं $_SERVER['REMOTE_ADDR']
जिसके लिए ग्राहक अनुरोध का आईपी पता वेब सर्वर द्वारा दिया गया है।
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
Host: 127.0.0.1
और यह आबादी में होगा HTTP_HOST
, इसलिए यह बिल्कुल विश्वसनीय तरीका नहीं है।
$whitelist = array('127.0.0.1', '::1');
एक पूरक के रूप में, एक समारोह के रूप में ...
function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
$_SERVER["REMOTE_ADDR"]
आपको उपयोगकर्ता का आईपी बताना चाहिए। हालांकि यह खराब है।
बहुत विस्तृत चर्चा के लिए इस भरपूर प्रश्न की जाँच करें ।
मुझे लगता है कि आप PHPMyAdmin के साथ जो कुछ भी याद करते हैं वह कुछ अलग है: कई MySQL सर्वर कॉन्फ़िगर किए गए हैं ताकि उन्हें केवल सुरक्षा कारणों से लोकलहोस्ट से एक्सेस किया जा सके।
मुझे खेद है लेकिन ये सभी उत्तर मुझे भयानक लगते हैं। मैं इस सवाल का जवाब देना चाहूंगा क्योंकि एक अर्थ में सभी मशीनें "लोकलहोस्ट" हैं।
प्रश्न होना चाहिए; मैं किस कोड के आधार पर अलग-अलग कोड पथ चलाता हूं।
मेरी राय में, सबसे आसान तरीका DEVMACHINE नामक एक फाइल बनाना है या जो आप वास्तव में चाहते हैं और फिर बस जांचें
file_exists ( 'DEVMACHINE')
लाइव होस्टिंग पर्यावरण पर अपलोड करते समय इस फ़ाइल को बाहर करना याद रखें!
यह समाधान नेटवर्क कॉन्फ़िगरेशन पर निर्भर नहीं है, इसे खराब नहीं किया जा सकता है और "लाइव-कोड" और "देव-कोड" चलाने के बीच स्विच करना आसान बनाता है।
ऐसा नहीं लगता कि आपको इसका उपयोग करना चाहिए $_SERVER['HTTP_HOST']
, क्योंकि http हेडर में यह आसानी से नकली है।
आप इसका उपयोग $_SERVER["REMOTE_ADDR"]
भी कर सकते हैं , यह अधिक सुरक्षित मूल्य है, लेकिन यह नकली भी संभव है। यह remote_addr
वह पता है जहां अपाचे परिणाम देता है।
REMOTE_ADDR
नकली करना संभव है, हालांकि यदि आप इसे 127.0.0.1
या तो नकली बनाना चाहते हैं ::1
, या इसके लिए मशीन से समझौता करने की आवश्यकता होती है, जिस पर एक स्पूफ REMOTE_ADDR
आपकी चिंताओं से कम है। प्रासंगिक उत्तर - stackoverflow.com/a/5092951/3774582
यदि आप एक श्वेतसूची / अनुमति देना चाहते हैं जो स्थैतिक आईपी और गतिशील नामों का समर्थन करता है ।
उदाहरण के लिए:
$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();
इस तरह आप नाम / आईपी की एक सूची निर्धारित कर सकते हैं जो (निश्चित रूप से) पता लगाने में सक्षम होगी। डायनामिक नाम विभिन्न बिंदुओं तक पहुंचने के लिए अधिक लचीलापन जोड़ते हैं।
आपके पास यहां दो सामान्य विकल्प हैं, आप अपनी स्थानीय होस्ट फ़ाइल में नाम सेट कर सकते हैं या आप केवल एक गतिशील नाम प्रदाता का उपयोग कर सकते हैं जो कहीं भी पाया जा सकता है।
यह फ़ंक्शन CACHES परिणाम देता है क्योंकि gethostbyname एक बहुत धीमा कार्य है।
इस शिष्य के लिए मैंने इस समारोह को लागू किया है:
function isIPWhitelisted($whitelist = false)
{
if ( isset($_SESSION) && isset($_SESSION['isipallowed']) )
{ return $_SESSION['isipallowed']; }
// This is the whitelist
$ipchecklist = array("localhost", "127.0.0.1", "::1");
if ($whitelist) $ipchecklist = $whitelist;
$iplist = false;
$isipallowed = false;
$filename = "resolved-ip-list.txt";
$filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line
if (file_exists($filename))
{
// If cache file has less than 1 day old use it
if (time() - filemtime($filename) <= 60*60*24*1)
$iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips
}
// If file was not loaded or found -> generate ip list
if (!$iplist)
{
$iplist = array(); $c=0;
foreach ( $ipchecklist as $k => $iptoresolve )
{
// gethostbyname: It's a VERY SLOW function. We really need to cache the resolved ip list
$ip = gethostbyname($iptoresolve);
if ($ip != "") $iplist[$c] = $ip;
$c++;
}
file_put_contents($filename, implode(";", $iplist));
}
if (in_array($_SERVER['REMOTE_ADDR'], $iplist)) // Check if the client ip is allowed
$isipallowed = true;
if (isset($_SESSION)) $_SESSION['isipallowed'] = $isipallowed;
return $isipallowed;
}
बेहतर विश्वसनीयता के लिए आप get_ip_address () के लिए $ _SERVER ['REMOTE_ADDR'] की जगह ले सकते हैं, जो @Pekka ने अपने पोस्ट में "इस बेशुमार प्रश्न" के रूप में उल्लेख किया है
$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
यदि ग्राहक सर्वर के समान मशीन पर है, तो यह निर्धारित करने के लिए तुलना करने के बारे में कैसे ?
$_SERVER['SERVER_ADDR']
हमेशा सर्वर पते को मज़बूती से वापस नहीं करता है, उदाहरण के लिए अगर लोड बैलेन्सर का उपयोग करते हुए यह लोड बैलेंसर का आईपी पता लौटाता है जो मुझे विश्वास है।
मुझे एक आसान जवाब मिला।
क्योंकि सभी स्थानीय ड्राइव में C: या D: या F: ... आदि होते हैं।
बस पता लगाएँ कि क्या दूसरा वर्ण है:
if ( substr_compare(getcwd(),":",1,1) == 0)
{
echo '<script type="text/javascript">alert(" The working dir is at the local computer ")</script>';
$client_or_server = 'client';
}
else
{
echo '<script type="text/javascript">alert(" The working dir is at the server ")</script>';
$client_or_server = 'server';
}