ব্যবহারকারী পিএইচপি-র লোকালহোস্টে থাকলে আমি কীভাবে সনাক্ত করতে পারি?


100

অন্য কথায়, আমার ওয়েব অ্যাপ্লিকেশনটি ব্যবহার করা ব্যক্তি যদি সার্ভারে থাকে তবে এটি কীভাবে বলতে পারি? যদি আমি সঠিকভাবে মনে রাখি তবে সুরক্ষার কারণে পিএইচপিএমইএডমিন এ জাতীয় কিছু করে।

উত্তর:


179

$_SERVER['REMOTE_ADDR']ওয়েব সার্ভারের দ্বারা অনুরোধ করা ক্লায়েন্টের আইপি ঠিকানাটি আপনি ব্যবহার করতে পারেন ।

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

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

4
যা আইপি স্পুফিংয়ের চেয়ে এটি ভাঙ্গতে আসলে সহজ করে তুলবে। আপনার সত্যই এটি পরিবর্তন করা উচিত।
পেক্কা

4
@ skcin7 আপনার সার্ভার সেটিং হতে পারে। এটি পরীক্ষা করে দেখুন।
মৌরি

4
@ পেক্কা 웃 আপনি কেবল উদাহরণ পাঠাতে পারেন Host: 127.0.0.1এবং এটি জনবহুল হবে HTTP_HOST, সুতরাং এটি মোটেই নির্ভরযোগ্য পদ্ধতি নয়।
দেজন মারজানভিভিć

4
হ্যাঁ, এটি খারাপ পরামর্শ এবং এটির বর্তমান ফর্ম এবং এটি সম্পাদনা করতে হবে - বা ডাউনভোটেড।
পেক্কা

4
আইপিভি 6 ভুলে যাবেন না:$whitelist = array('127.0.0.1', '::1');
ক্রেজিম্যাক্স

26

পরিপূরক হিসাবে, একটি ফাংশন হিসাবে ...

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

4
ভাল অনুশীলন হিসাবে আমি "অন্যথায় মিথ্যা ফিরে" যুক্ত করার পরামর্শ দেব; যাতে ফাংশন সর্বদা একটি বুলিয়ান মান দেয়। অথবা অন্যথায়, কেবল "যদি" সম্পূর্ণ এবং অপরের পরিবর্তে "ফেরত ইন_আরে ($ _SSERVER ['REMOTE_ADDR'], $ শ্বেত তালিকা) সরান;"
জো ইরবি 18

16

আরও নতুন ওএস ব্যবহারকারীরা (উইন,, ৮) তাদের শ্বেত তালিকাতে একটি আইপিভি 6-ফর্ম্যাট রিমোট ঠিকানা অন্তর্ভুক্ত করার জন্য প্রয়োজনীয় খুঁজে পেতে পারে:

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

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

14

$_SERVER["REMOTE_ADDR"]আপনাকে ব্যবহারকারীর আইপি বলতে হবে। যদিও এটি স্পোকযোগ্য।

খুব বিশদ আলোচনার জন্য এই অনুগ্রহ প্রশ্নটি পরীক্ষা করুন ।

আমি মনে করি আপনি পিএইচপিএমইএডমিনের সাথে যা মনে রাখছেন তা অন্যরকম: অনেক মাইএসকিউএল সার্ভারগুলি কনফিগার করা হয়েছে যাতে তারা কেবল সুরক্ষার কারণে লোকালহোস্ট থেকে অ্যাক্সেস করতে পারে।


এটি লক্ষণীয় যে কয়েকটি মাইএসকিউএল সার্ভারগুলি সর্বজনীন ইন্টারফেসের সাথে আবদ্ধ না করে এমনভাবে কনফিগার করা হয়েছে। একইভাবে, আপনি যদি একইভাবে কোনও পিএইচপি অ্যাপ্লিকেশনটি সীমাবদ্ধ রাখতে চান, তবে আপনাকে কেবল কোনও অভ্যন্তরীণ ইন্টারফেসের সাথে আবদ্ধ অ্যাপাচি উদাহরণের মাধ্যমে এটি পরিবেশন করা বিবেচনা করা উচিত।
ফ্রাঙ্ক ফার্মার

7

আমি দুঃখিত তবে এই সব উত্তর আমার কাছে ভয়ঙ্কর বলে মনে হচ্ছে। আমি প্রশ্নটি পুনরায় চাপিয়ে দেওয়ার পরামর্শ দেব কারণ একটি অর্থে সমস্ত মেশিনই "লোকালহোস্ট"।

প্রশ্ন হওয়া উচিত; কোন মেশিনে এটি চালিত হয় তার উপর নির্ভর করে আমি কীভাবে বিভিন্ন কোড পাথ পরিচালনা করব।

আমার মতে, সবচেয়ে সহজ উপায় হল DEVMACHINE নামক একটি ফাইল তৈরি করা বা আপনি যা চান তা যাচাই করে তারপরে কেবল যাচাই করা

file_exists ('DEVMACHINE')

লাইভ হোস্টিং পরিবেশে আপলোড করার সময় এই ফাইলটি বাদ দিতে ভুলবেন না!

এই সমাধানটি নেটওয়ার্ক কনফিগারেশনের উপর নির্ভর করে না, এটি ছদ্মবেশযুক্ত করা যায় না এবং "লাইভ-কোড" এবং "দেব-কোড" চলমান মধ্যে স্যুইচ করা সহজ করে তোলে।


6

আপনার ব্যবহার করা উচিত বলে মনে হচ্ছে না $_SERVER['HTTP_HOST'], কারণ এটি সহজেই নকল, HTTP শিরোনামের মান।

আপনি $_SERVER["REMOTE_ADDR"]খুব ব্যবহার করতে পারেন , এটি আরও সুরক্ষিত মান, তবে এটি জাল করাও সম্ভব। এটি remote_addrসেই ঠিকানা যেখানে অ্যাপাচি ফলাফল দেয়।


REMOTE_ADDRনকল করা সম্ভব, তবে আপনি যদি এটি নকল করতে চান 127.0.0.1বা হিসাবে ::1, তার জন্য মেশিনের সাথে আপোস করা দরকার, যেখানে একটি স্পোফড REMOTE_ADDRআপনার উদ্বেগের মধ্যে সবচেয়ে কম। প্রাসঙ্গিক উত্তর - stackoverflow.com/a/5092951/3774582
গুজ

1

যদি আপনি কোনও শ্বেতলিস্ট / অনুমতি তালিকা থাকতে চান যা স্থির আইপি এবং গতিশীল নামগুলি সমর্থন করে ।

উদাহরণ স্বরূপ:

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

এইভাবে আপনি নাম / আইপিগুলির একটি তালিকা সেট করতে পারেন যা সনাক্ত করতে সক্ষম হবে (নিশ্চিত হয়ে)। গতিশীল নামগুলি বিভিন্ন পয়েন্ট থেকে অ্যাক্সেসের জন্য আরও নমনীয়তা যুক্ত করে।

আপনার এখানে দুটি সাধারণ বিকল্প রয়েছে, আপনি আপনার স্থানীয় হোস্ট ফাইলে একটি নাম সেট করতে পারেন বা আপনি কেবলমাত্র একটি ডায়নামিক নাম সরবরাহকারীর ব্যবহার করতে পারেন যা যে কোনও জায়গায় পাওয়া যায়।

এই ফাংশনটি ক্যাস করে কারণ গ্যাথস্টবাইমনাম খুব ধীর ফাংশন।

এই pupose জন্য আমি এই ফাংশনটি প্রয়োগ করেছি:

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 তার উল্লেখ পোস্টে যেমন "এই খয়রাত প্রশ্ন"


4
আমি জানি না কেন কেউ আমার উত্তরে নেতিবাচক স্কোর সেট করেছে যখন এটি স্পষ্টতই গতিশীল নাম রেজোলিউশন সরবরাহ করে এবং অন্যেরা তা নয়। ডিএনএস রেজোলিউশনটি ধীর গতির কারণেই ক্যাশে রেজোলিউশন প্রয়োজন।
হেরোসেলহিম

1

$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']সার্ভারের মতো ক্লায়েন্ট একই মেশিনে রয়েছে কিনা তা নির্ধারণের জন্য কীভাবে তুলনা করবেন?


$_SERVER['SERVER_ADDR']সার্ভারের ঠিকানাটি সর্বদা নির্ভরযোগ্যভাবে ফিরিয়ে দেয় না যেমন লোড ব্যালেন্সার ব্যবহার করে এটি আমার বিশ্বাস করা লোড ব্যালেন্সারের আইপি ঠিকানা প্রদান করে।
মাইক ডব্লিউ

-5

আমি একটি সহজ উত্তর খুঁজে পেয়েছি।

কারণ সমস্ত লোকাল ড্রাইভে সি: বা ডি: বা এফ: ... ইত্যাদি রয়েছে have

দ্বিতীয় অক্ষরটি একটি কিনা তা সনাক্ত করুন:

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';
}

এই সমাধানটি ত্রুটিগুলির জন্য বেশ সংবেদনশীল বলে মনে হয় এবং এটি কেবল উইন্ডোজে কাজ করে।
হুস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.