كيف يمكنني اكتشاف ما إذا كان المستخدم موجودًا على مضيف محلي في PHP؟

StackOverflow https://stackoverflow.com/questions/2053245

  •  20-09-2019
  •  | 
  •  

سؤال

بمعنى آخر، كيف يمكنني معرفة ما إذا كان الشخص الذي يستخدم تطبيق الويب الخاص بي موجودًا على الخادم الموجود عليه؟إذا كنت أتذكر بشكل صحيح، فإن PHPMyAdmin يفعل شيئًا كهذا لأسباب أمنية.

هل كانت مفيدة؟

المحلول

ويمكنك أيضا استخدام $_SERVER['REMOTE_ADDR'] التي تعطى عنوان IP للعميل طلب من قبل خادم الويب.

$whitelist = array(
    '127.0.0.1',
    '::1'
);

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

نصائح أخرى

واستكمالا، بوصفها وظيفة ...

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}

ومستخدمي OS أحدث (وين 7، 8) قد تجد أيضا أنه من الضروري تضمين عنوان بعيد IPV6 تنسيق في مجموعة من القائمة البيضاء:

$whitelist = array('127.0.0.1', "::1");

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

$_SERVER["REMOTE_ADDR"] يجب أن يخبرك IP الخاص بالمستخدم.إنها قابلة للتحايل، رغم ذلك.

يفحص هذا السؤال فضله لمناقشة مفصلة للغاية.

أعتقد أن ما تتذكره مع PHPMyAdmin شيء مختلف:تم تكوين العديد من خوادم MySQL بحيث لا يمكن الوصول إليها إلا من المضيف المحلي لأسباب أمنية.

وولا يبدو أنك يجب أن تستخدم $_SERVER['HTTP_HOST']، لأن هذه هي القيمة في رأس HTTP، مزورة بسهولة.

يمكنك استخدام $_SERVER["REMOTE_ADDR"] جدا، وهذا هو قيمة أكثر أمنا، ولكن من الممكن أيضا وهمية. هذا remote_addr هو العنوان الذي ينتج عوائد أباتشي ل.

إذا كنت تريد أن يكون لديك القائمة البيضاء/القائمة المسموح بها الذي يدعم عناوين IP ثابتة و أسماء ديناميكية.

على سبيل المثال:

$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();

بهذه الطريقة يمكنك تعيين قائمة الأسماء/عناوين IP سيكون من الممكن (بالتأكيد) اكتشافه.تضيف الأسماء الديناميكية مزيدًا من المرونة للوصول من نقاط مختلفة.

لديك خياران شائعان هنا، يمكنك تعيين اسم في ملفك ملف المضيفين المحليين أو يمكنك استخدام واحدة فقط مزود الاسم الديناميكي التي يمكن العثور عليها في أي مكان.

تقوم هذه الوظيفة بتخزين النتائج لأن 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;
}

للحصول على موثوقية أفضل، يمكنك استبدال $_SERVER['REMOTE_ADDR'] ل get_ip_address() التي ذكرهاPekka في كتابه بريد مثل "هذا السؤال مكافأة"

وأنا آسف ولكن كل هذه الإجابات يبدو فظيعا بالنسبة لي. أود أن أقترح إعادة صياغة السؤال لأنه في شعور جميع الآلات هي "مضيف".

يجب أن يكون السؤال. كيف يمكنني تشغيل مسارات مختلفة متاحة اعتمادا على الآلة التي يتم تنفيذها عليه.

في رأيي، وأسهل طريقة هي إنشاء ملف يسمى DEVMACHINE أو ما تريد حقا ثم ببساطة تحقق

<اقتباس فقرة>   

وfile_exists ( 'DEVMACHINE')

وحفظ لاستبعاد هذا الملف عند تحميلها على البيئة استضافة حية!

وهذا الحل لا يعتمد على تكوين الشبكة، فإنه لا يمكن تزييف ويجعل من السهل التبديل بين تشغيل "رمز العيش" و "ديف رمز".

وماذا عن لمقارنة $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_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';
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top