Pertanyaan Bagaimana cara mendapatkan alamat IP klien di PHP?


Bagaimana saya bisa mendapatkan alamat IP klien menggunakan PHP?

Saya ingin menyimpan catatan pengguna yang masuk ke situs web saya melalui alamat IP-nya.


977
2018-06-09 04:50


asal


Jawaban:


Apa pun yang Anda lakukan, pastikan untuk tidak mempercayai data yang dikirim dari klien. $_SERVER['REMOTE_ADDR'] berisi alamat IP asli dari pihak yang terhubung. Itu adalah nilai yang paling dapat diandalkan yang dapat Anda temukan.

Namun, mereka bisa berada di belakang server proxy yang dalam hal ini proxy mungkin telah mengatur $_SERVER['HTTP_X_FORWARDED_FOR'], tetapi nilai ini mudah dipalsukan. Misalnya, dapat diatur oleh seseorang tanpa proxy, atau IP dapat berupa IP internal dari LAN di belakang proxy.

Ini berarti bahwa jika Anda akan menyimpan $_SERVER['HTTP_X_FORWARDED_FOR'], pastikan Anda juga Selamatkan $_SERVER['REMOTE_ADDR'] nilai. Misalnya. dengan menyimpan kedua nilai di berbagai bidang dalam database Anda.

Jika Anda akan menyimpan IP ke database sebagai string, pastikan Anda memiliki ruang untuk setidaknya 45 karakter. IPv6 di sini untuk tetap dan alamat tersebut lebih besar dari alamat IPv4 yang lebih lama.

(Perhatikan bahwa IPv6 biasanya menggunakan 39 karakter paling banyak tetapi ada juga yang khusus Notasi IPv6 untuk alamat IPv4 yang dalam bentuk penuhnya bisa hingga 45 karakter. Jadi jika Anda tahu apa yang Anda lakukan, Anda dapat menggunakan 39 karakter, tetapi jika Anda hanya ingin mengatur dan melupakannya, gunakan 45).


1163
2018-06-09 05:15



$_SERVER['REMOTE_ADDR'] mungkin sebenarnya tidak berisi alamat IP klien nyata, karena ini akan memberi Anda alamat proxy untuk klien yang terhubung melalui proxy, misalnya. Itu mungkin baiklah menjadi apa yang Anda inginkan, tergantung apa yang Anda lakukan dengan IP. Alamat RFC1918 pribadi seseorang mungkin tidak membantu Anda jika Anda mengatakan, mencoba untuk melihat dari mana asal lalu lintas Anda, atau mengingat apa IP pengguna terakhir terhubung dari, di mana IP publik dari proxy atau gateway NAT mungkin lebih sesuai untuk disimpan.

Ada beberapa header HTTP seperti X-Forwarded-For yang mungkin atau mungkin tidak diatur oleh berbagai proksi. Masalahnya adalah bahwa mereka hanya header HTTP yang dapat diatur oleh siapa saja. Tidak ada jaminan tentang konten mereka. $_SERVER['REMOTE_ADDR'] adalah alamat IP fisik aktual yang diterima server web dari koneksi tersebut dan respons tersebut akan dikirimkan. Yang lainnya hanyalah informasi yang sewenang-wenang dan sukarela. Hanya ada satu skenario di mana Anda dapat mempercayai informasi ini: Anda mengendalikan proxy yang menetapkan header ini. Berarti hanya jika Anda tahu 100% di mana dan bagaimana header ditetapkan jika Anda mengindahkannya untuk sesuatu yang penting.

Karena itu, inilah beberapa contoh kode:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

Catatan Editor: Menggunakan kode di atas telah implikasi keamanan. Klien dapat mengatur semua informasi tajuk HTTP (mis. $_SERVER['HTTP_...) ke nilai sewenang-wenang yang diinginkannya. Karena itu jauh lebih dapat diandalkan untuk digunakan $_SERVER['REMOTE_ADDR'], karena ini tidak dapat diatur oleh pengguna.

Dari: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html


376
2017-09-11 04:01



echo $_SERVER['REMOTE_ADDR'];

http://php.net/manual/en/reserved.variables.server.php


185
2018-06-09 04:51



Itu harus terkandung dalam $_SERVER['REMOTE_ADDR'] variabel.


79
2017-09-11 03:38



Berikut ini adalah contoh kode bersih dari cara yang baik untuk mendapatkan ip pengguna.

$ip = $_SERVER['HTTP_CLIENT_IP']?$_SERVER['HTTP_CLIENT_IP']:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']);

Ini adalah versi yang lebih pendek yang menggunakan operator elvis

$_SERVER['HTTP_CLIENT_IP']?:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?:$_SERVER['REMOTE_ADDR']);

Berikut ini adalah versi yang menggunakan isset untuk menghapus pemberitahuan (terima kasih, @shasi kanth)

$ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];

79
2017-10-08 16:20



Solusi favorit saya adalah cara menggunakan Zend Framework 2. Ini juga mempertimbangkan $_SERVER properti HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, REMOTE_ADDR tetapi mendeklarasikan kelas untuk mengatur beberapa proksi tepercaya dan mengembalikan satu alamat IP bukan larik. Saya pikir ini adalah solusi yang paling dekat dengannya:

class RemoteAddress
{
    /**
     * Whether to use proxy addresses or not.
     *
     * As default this setting is disabled - IP address is mostly needed to increase
     * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
     * just for more flexibility, but if user uses proxy to connect to trusted services
     * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
     *
     * @var bool
     */
    protected $useProxy = false;

    /**
     * List of trusted proxy IP addresses
     *
     * @var array
     */
    protected $trustedProxies = array();

    /**
     * HTTP header to introspect for proxies
     *
     * @var string
     */
    protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';

    // [...]

    /**
     * Returns client IP address.
     *
     * @return string IP address.
     */
    public function getIpAddress()
    {
        $ip = $this->getIpAddressFromProxy();
        if ($ip) {
            return $ip;
        }

        // direct IP address
        if (isset($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return '';
    }

    /**
     * Attempt to get the IP address for a proxied client
     *
     * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
     * @return false|string
     */
    protected function getIpAddressFromProxy()
    {
        if (!$this->useProxy
            || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
        ) {
            return false;
        }

        $header = $this->proxyHeader;
        if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
            return false;
        }

        // Extract IPs
        $ips = explode(',', $_SERVER[$header]);
        // trim, so we can compare against trusted proxies properly
        $ips = array_map('trim', $ips);
        // remove trusted proxy IPs
        $ips = array_diff($ips, $this->trustedProxies);

        // Any left?
        if (empty($ips)) {
            return false;
        }

        // Since we've removed any known, trusted proxy servers, the right-most
        // address represents the first IP we do not know about -- i.e., we do
        // not know if it is a proxy server, or a client. As such, we treat it
        // as the originating IP.
        // @see http://en.wikipedia.org/wiki/X-Forwarded-For
        $ip = array_pop($ips);
        return $ip;
    }

    // [...]
}

Lihat kode lengkapnya di sini: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php


47
2017-07-07 09:02



Ada berbagai jenis pengguna di balik Internet, Jadi kami ingin menangkap alamat IP dari ramuan yang berbeda. Yaitu,

1 $_SERVER['REMOTE_ADDR'] - Ini berisi alamat IP asli dari klien. Itu adalah nilai paling tepercaya yang dapat Anda temukan dari pengguna.

2 $_SERVER['REMOTE_HOST'] - Ini akan mengambil nama Host dari mana pengguna melihat halaman saat ini. Tetapi agar skrip ini berfungsi, Pencarian Nama Domain Di dalam httpd.conf harus dikonfigurasi.

3 $_SERVER['HTTP_CLIENT_IP'] - Ini akan mengambil alamat IP ketika pengguna berasal dari layanan Internet Bersama.

4. $_SERVER['HTTP_X_FORWARDED_FOR'] - Ini akan mengambil alamat IP dari pengguna saat dia berada di belakang proxy

Jadi kita bisa menggunakan fungsi gabungan berikut ini untuk mendapatkan alamat IP Real dari pengguna yang melihat dalam posisi berbeda,

// Function to get the user IP address
function getUserIP() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

34
2017-12-29 15:18



Ini adalah metode paling canggih yang saya temukan, sudah mencoba beberapa yang lain di masa lalu. Berlaku untuk memastikan mendapatkan alamat IP pengunjung (tetapi harap dicatat bahwa setiap peretas dapat memalsukan alamat ip dengan mudah).

function get_ip_address() {
    // check for shared internet/ISP IP
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    }

    // check for IPs passing through proxies
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // check if multiple ips exist in var
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
            $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($iplist as $ip) {
                if (validate_ip($ip))
                    return $ip;
            }
        } else {
            if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
        return $_SERVER['HTTP_X_FORWARDED'];
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
        return $_SERVER['HTTP_FORWARDED_FOR'];
    if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
        return $_SERVER['HTTP_FORWARDED'];

    // return unreliable ip since all else failed
    return $_SERVER['REMOTE_ADDR'];
}

/**
 * Ensures an ip address is both a valid IP and does not fall within
 * a private network range.
 */
function validate_ip($ip) {
    if (strtolower($ip) === 'unknown')
        return false;

    // generate ipv4 network address
    $ip = ip2long($ip);

    // if the ip is set and not equivalent to 255.255.255.255
    if ($ip !== false && $ip !== -1) {
        // make sure to get unsigned long representation of ip
        // due to discrepancies between 32 and 64 bit OSes and
        // signed numbers (ints default to signed in PHP)
        $ip = sprintf('%u', $ip);
        // do private network range checking
        if ($ip >= 0 && $ip <= 50331647) return false;
        if ($ip >= 167772160 && $ip <= 184549375) return false;
        if ($ip >= 2130706432 && $ip <= 2147483647) return false;
        if ($ip >= 2851995648 && $ip <= 2852061183) return false;
        if ($ip >= 2886729728 && $ip <= 2887778303) return false;
        if ($ip >= 3221225984 && $ip <= 3221226239) return false;
        if ($ip >= 3232235520 && $ip <= 3232301055) return false;
        if ($ip >= 4294967040) return false;
    }
    return true;
}

sumber: http://blackbe.lt/advanced-method-to-obtain-the-client-ip-in-php/


29
2018-01-29 14:37