109

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

4

11 に答える 11

183

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
于 2010-01-12T23:37:34.320 に答える
34

補完として、関数として...

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
于 2014-02-11T13:13:33.237 に答える
18

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
于 2013-09-25T18:06:00.250 に答える
14

$_SERVER["REMOTE_ADDR"]ユーザーのIPを教えてくれるはずです。しかし、それはなりすましです。

非常に詳細な議論については、この報奨金の質問を確認してください。

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

于 2010-01-12T23:29:20.730 に答える
12

申し訳ありませんが、これらすべての答えは私にはひどいようです。ある意味ですべてのマシンが「ローカルホスト」であるため、質問を言い換えることをお勧めします。

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

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

file_exists('DEVMACHINE')

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

このソリューションはネットワーク構成に依存せず、なりすましができず、実行中の「ライブコード」と「開発コード」を簡単に切り替えることができます。

于 2019-04-26T10:10:33.733 に答える
6

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

あなたも使うかもしれませ$_SERVER["REMOTE_ADDR"]ん、これはより安全な価値ですが、偽造することも可能です。これremote_addrは、Apacheが結果を返すアドレスです。

于 2011-04-26T14:16:41.547 に答える
1

静的IP動的名をサポートするホワイトリスト/許可リストが必要な場合。

例えば:

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

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

ここには2つの一般的なオプションがあります。ローカルhostsファイルに名前を設定するか、どこにでもある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;
}

信頼性を高めるために、 @Pekkaが投稿「この報奨金の質問」と述べたget_ip_address()の$_SERVER['REMOTE_ADDR']を置き換えることができます。

于 2014-10-03T18:01:18.813 に答える
1

$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']クライアントがサーバーと同じマシン上にあるかどうかを判断するために比較してみませんか?

于 2017-05-05T12:05:35.820 に答える
1

この単純なPHP条件を使用しました

if($_SERVER['HTTP_HOST'] == 'localhost')
{
    die('Localhost');
}
于 2021-02-28T14:55:41.267 に答える
0

また、ローカルホストであるかどうかを確認する別の簡単な方法があります。このコードは、ipがプライベートまたは予約済みの範囲にあるかどうかをチェックします。

  • ipv4とipv6をサポートします。
  • 127.0.0.1〜127.255.255.255のようなIP範囲をサポート

PHPコード:

function is_localhost() {

    $server_ip = null;

    if ( defined( 'INPUT_SERVER' ) && filter_has_var( INPUT_SERVER, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( defined( 'INPUT_ENV' ) && filter_has_var( INPUT_ENV, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_ENV, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
        $server_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP );
    }

    if ( empty( $server_ip ) ) {
        $server_ip = '127.0.0.1';
    }

    return empty( filter_var( $server_ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE ));
}
  1. get ipfilter_inputの場合、ユーザーによるコードへのIPインジェクションを回避するために使用します。
  2. 場合によってfilter_input は、CGIスクリプトでサポートされていないため、存在しない場合は、$_SERVERvarを使用して通常の方法でIPを取得します。
  3. FILTER_VALIDATE_IPそして、このリンクFILTER_FLAG_NO_PRIV_RANGEでより多くの情報を見つけることができるphpサイトに文書化されています。
于 2022-03-02T18:40:45.407 に答える
-5

簡単な答えを見つけました。

すべてのローカルドライブにはC:またはD:またはF:...などがあるためです。

2番目の文字が:であるかどうかを検出するだけです。

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';
}
于 2017-03-03T21:19:12.890 に答える