Как получить IP-адрес клиента в PHP [duplicate]

Пример с несколькими изображениями с использованием JavaScript (jQuery) и HTML5

JavaScript (jQuery)

function readURL(input) {
     for(var i =0; i< input.files.length; i++){
         if (input.files[i]) {
            var reader = new FileReader();

            reader.onload = function (e) {
               var img = $('<img id="dynamic">');
               img.attr('src', e.target.result);
               img.appendTo('#form1');  
            }
            reader.readAsDataURL(input.files[i]);
           }
        }
    }

    $("#imgUpload").change(function(){
        readURL(this);
    });
}

Разметка (HTML)

<form id="form1" runat="server">
    <input type="file" id="imgUpload" multiple/>
</form>
1100
задан Peter Mortensen 13 February 2019 в 15:56
поделиться

5 ответов

Это должно содержаться в $_SERVER['REMOTE_ADDR'] переменная.

87
ответ дан JJJ 13 February 2019 в 15:56
поделиться

$_SERVER['REMOTE_ADDR'] может не на самом деле содержать реальные клиентские IP-адреса, поскольку это даст Вам адрес прокси для клиентов, соединенных через прокси, например. Это может быть тем, что Вы действительно хотите, тем не менее, зависящий что Ваше выполнение с дюйм/с. Чей-то частный адрес RFC1918 не может принести Вам пользы, если Вы, говорят, пытаясь видеть, где Ваш трафик порождает из или помнит, какой IP пользователь, в последний раз соединенный от, где общедоступный IP или шлюза NAT прокси мог бы быть более соответствующим хранилищу.

Существует несколько HTTP-заголовков как X-Forwarded-For который может или не может быть установлен различными прокси. Проблема состоит в том, что это - просто HTTP-заголовки, которые могут быть установлены любым. Нет никакой гарантии об их содержании. $_SERVER['REMOTE_ADDR'] фактический физический IP-адрес, из которого веб-сервер получил соединение и что ответ будет отправлен в. Что-либо еще - просто произвольная и добровольная информация. Существует только один сценарий, которому можно доверять этой информации: Вы управляете прокси, который устанавливает этот заголовок. Значение, только если Вы знаете 100%, где и как заголовок был установлен, должно Вы учитывать его для чего-либо важного.

Однако вот некоторый пример кода:

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

Примечание редактора: Используя вышеупомянутый код имеет последствия безопасности. Клиент может установить всю Информацию заголовка HTTP (т.е. $_SERVER['HTTP_...) к любому произвольному значению это хочет. Как таковой это намного более надежно для использования $_SERVER['REMOTE_ADDR'], поскольку это не может быть установлено пользователем.

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

429
ответ дан Chuck Le Butt 13 February 2019 в 15:56
поделиться

Ответ - использовать переменную $ _ SERVER . Например, $ _ SERVER ["REMOTE_ADDR"] вернет IP-адрес клиента.

30
ответ дан 19 December 2019 в 20:15
поделиться
200
ответ дан 19 December 2019 в 20:15
поделиться

Что бы вы ни делали, не доверяйте данным, отправленным от клиента. $ _ SERVER ['REMOTE_ADDR'] содержит реальный IP-адрес подключающейся стороны. Это самое надежное значение, которое вы можете найти.

Однако они могут находиться за прокси-сервером, и в этом случае прокси мог установить $ _ SERVER ['HTTP_X_FORWARDED_FOR'] , но это значение легко подделать. Например, он может быть установлен кем-то без прокси, или IP может быть внутренним IP из локальной сети за прокси.

Это означает, что если вы собираетесь сохранить $ _ SERVER ['HTTP_X_FORWARDED_FOR'] , убедитесь, что вы также сохранили $ _ SERVER ['REMOTE_ADDR'] значение. Например. сохраняя оба значения в разных полях вашей базы данных.

Если вы собираетесь сохранить IP-адрес в базе данных в виде строки, убедитесь, что у вас есть место как минимум для 45 символов . IPv6 здесь, чтобы остаться, и эти адреса больше, чем старые адреса IPv4.

(Обратите внимание, что IPv6 обычно использует не более 39 символов, но также существует специальная нотация IPv6 для адресов IPv4 , которая в полной форме может содержать до 45 символов. Итак, если вы знаете, что делаете вы можете использовать 39 символов, но если вы просто хотите установить и забыть, используйте 45).

1284
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: