web-dev-qa-db-ja.com

ユーザーがPHPのローカルホストにいるかどうかを検出するにはどうすればよいですか?

言い換えれば、Webアプリケーションを使用している人が、それが常駐するサーバー上にあるかどうかをどのように確認できますか?私の記憶が正しければ、PHPMyAdminはセキュリティ上の理由からこのようなことをします。

86
Richie Marquez

$_SERVER['REMOTE_ADDR']を使用することもできます。この場合、Webサーバーによって要求されているクライアントのIPアドレスが与えられます。

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

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

補完として、機能として...

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

新しいOSユーザー(Win 7、8)は、ホワイトリスト配列にIPV6形式のリモートアドレスを含める必要がある場合もあります。

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

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

$_SERVER["REMOTE_ADDR"]は、ユーザーのIPを通知する必要があります。ただし、なりすましです。

非常に詳細な議論については this bounty question を確認してください。

PHPMyAdminで覚えていることは違うと思います。多くのMySQLサーバーは、セキュリティ上の理由からlocalhostからのみアクセスできるように設定されています。

14
Pekka 웃

$_SERVER['HTTP_Host']を使用する必要はないようです。これは、httpヘッダーの値であり、簡単に偽造されているためです。

$_SERVER["REMOTE_ADDR"]も使用できます。これはより安全な値ですが、偽造することも可能です。このremote_addrは、Apacheが結果を返すアドレスです。

6
nicola

すみませんが、これらの答えはすべてひどいようです。ある意味ではすべてのマシンが「localhost」であるため、質問を言い換えることをお勧めします。

質問は次のとおりです。実行されるマシンに応じて異なるコードパスを実行するにはどうすればよいですか。

私の意見では、最も簡単な方法は、DEVMACHINEと呼ばれるファイル、または実際に必要なものを作成してから、単純にチェックすることです。

file_exists( 'DEVMACHINE')

ライブホスティング環境にアップロードするときは、このファイルを忘れずに除外してください!

このソリューションはネットワーク構成に依存していないため、スプーフィングされることはなく、「ライブコード」と「開発コード」の実行を簡単に切り替えることができます。

1
Daniklad

ホワイトリスト/ allowlistが必要な場合静的IPおよび動的な名前

例えば:

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

このようにして、(確実に)検出できるnames/IPsのリストを設定できます。動的な名前は、さまざまなポイントからアクセスするための柔軟性を高めます。

ここには2つの一般的なオプションがあり、ローカルホストファイルに名前を設定できます、または1つだけを使用できますどこにでもある動的な名前プロバイダー

Gethostbynameは非常に遅い関数であるため、この関数はCACHESになります。

この目的のために、この関数を実装しました:

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が post as "this bounty question"で言及したこと

1
Heroselohim

比較する方法$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']クライアントがサーバーと同じマシン上にあるかどうかを判断するには?

0
Eugen Wesseloh