1

LAMP サーバーを備えた小さなホーム ネットワークがあります。私はこれらの2つのトピックから知っています:

訪問者のIPを確認する方法は? および PHP:クライアントがローカルかどうかを確認する方法は?

訪問者の IP に関する情報を特定するには、さまざまな方法があることを確認してください。しかし、PHP を使用して、訪問者がローカル ネットワークからであることを 100% 確実に判断することは可能でしょうか? 192.168.0.* ネットワークで自分の Web サイトを自由に利用できるようにし、パスワードを他の人から保護したいと考えています。また、プロキシの使用またはその他の理由により、ローカル ネットワークの誰かが追加の資格情報を提供することを余儀なくされる場合もありません。外部の人がパスワードを要求されることを 100% 確実にしたいだけです。

あるいは、別の言い方をすれば、私のローカル ネットワークの外にいるハッカーの可能性がある場合、Apache をだまして訪問者がローカル ネットワークにいると思わせることは可能でしょうか?

通常、訪問者の IP を認識する努力は、Web サイトの外観や言語をカスタマイズすることに向けられていますが、上記のセキュリティ上の理由でそれを使用することは可能ですか?

4

3 に答える 3

2
<?php
/**
 * Check if a client IP is in our Server subnet
 *
 * @param string $client_ip
 * @param string $server_ip
 * @return boolean
 */
function clientInSameSubnet($client_ip=false,$server_ip=false) {
    if (!$client_ip)
        $client_ip = $_SERVER['REMOTE_ADDR'];
    if (!$server_ip)
        $server_ip = $_SERVER['SERVER_ADDR'];
    // Extract broadcast and netmask from ifconfig
    if (!($p = popen("ifconfig","r"))) return false;
    $out = "";
    while(!feof($p))
        $out .= fread($p,1024);
    fclose($p);
    // This is because the php.net comment function does not
    // allow long lines.
    $match  = "/^.*".$server_ip;
    $match .= ".*Bcast:(\d{1,3}\.\d{1,3}i\.\d{1,3}\.\d{1,3}).*";
    $match .= "Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/im";
    if (!preg_match($match,$out,$regs))
        return false;
    $bcast = ip2long($regs[1]);
    $smask = ip2long($regs[2]);
    $ipadr = ip2long($client_ip);
    $nmask = $bcast & $smask;
    return (($ipadr & $smask) == ($nmask & $smask));
}
?>

ソース

于 2013-03-01T23:10:25.843 に答える
0

これは、satisfy ディレクティブを使用して Apache から行う必要があります。AllowOverride が apache.conf に設定されていることを確認する必要があります。次に、.htaccess で次の操作を実行できます (または、仮想ホストのディレクティブに配置できます)。

AuthType Basic
AuthName "Private Site"
AuthUserFile /etc/httpd/conf.d/htpasswd/www.example.com
Order deny,allow
Allow from 192.168.0.0/16
Deny from all
Require valid-user
Satisfy Any

彼らがこれを回避できる唯一の方法は、内部ネットワークから何らかの方法でプロキシした場合です。

于 2013-03-02T01:40:20.050 に答える
0

そのようなセットアップを安全に行うことができるかどうかは、ファイアウォールを持っているかどうかにわずかに依存します。PHPではそれほどではありません。

IP スプーフィングについて調べてください。 IP アドレス スプーフィング - ウィキペディア

より良い方法は、その Web サーバーをホスティング プロバイダーに配置し、外部 IP アクセスのみを許可することです。それでも、100% 安全というわけではありません。

于 2013-03-01T23:12:00.333 に答える