Як в PHP дізнатися IP адресу сервера і відвідувача

  1. Як в PHP дізнатися IP сервера
  2. Як в PHP отримати IP відвідувача
  3. Як в PHP визначити IP користувача, що використовує проксі

Доброго времени суток 🙂   На практиці часто виникає необхідність дізнатися IP в PHP скрипт сайту Доброго времени суток 🙂

На практиці часто виникає необхідність дізнатися IP в PHP скрипт сайту. Причому, це може бути як IP адресу сервера, так і клієнта, яка провадить дії на вашому ресурсі.

Причому, останній іноді може користуватися сайтом не безпосередньо, а з якихось причин підключаючись до нього через проксі сервер. Цей випадок ускладнює життя тим, що для підключення використовується змінений IP адреса.

Але, на щастя, в PHP отримати IP адресу як клієнта, так і самого сайту в цьому випадку більш, ніж реально. Причому, для цього не потрібні ніякі спеціальні бібліотеки та засоби движків сайтів . Все необхідне вже є в самому PHP «на борту».

Нам залишилося тільки користуватися 🙂

Як в PHP дізнатися IP сервера

Вся необхідна інформація про IP сервера, та й користувача теж, в PHP доступна через суперглобальний масив $ _SERVER. Однак, крім перерахованих даних він містить ще багато різної інформації.

У цій ситуації відшукати потрібне стає непростим завданням, для вирішення якої потрібно знати призначення змінних масиву.

Зокрема, для того, щоб в PHP визначити IP адресу сервера, в коді потрібно прописати наступну конструкцію:

<? Php echo $ _SERVER [ 'SERVER_ADDR']; ?>

Даний PHP код дозволить вам вивести на екран IP адреса сервера, на якому він запускається. Це ж значення буде і IP адресою сайту, якщо він вам де-небудь знадобиться.

Як в PHP отримати IP відвідувача

Для визначення в PHP IP користувача, з якого він підключається до вашого сайту, ми скористаємося тим же масивом $ _SERVER. В даному випадку нас буде цікавити змінна REMOTE_ADDR, вміст якої можна вивести на екран звичним способом:

<? Php echo $ _SERVER [ 'REMOTE_ADDR']; ?>

Однак, у випадках використання клієнтом проксі з'єднань, тобто коли при підключенні трафік йде через сторонній проксі сервер, дана змінна буде містити IP адреса не відвідувача, а проксі сервера.

Щоб дізнатися в PHP IP адреса відвідувача в даному випадку, потрібно скористатися іншим способом.

Як в PHP визначити IP користувача, що використовує проксі

Насамперед, в PHP IP відвідувача при використанні проксі можна спробувати отримати в такий спосіб:

<? Php echo $ _SERVER [ 'HTTP_CLIENT_IP']; ?>

Даний код можна знайти практично у всіх PHP скрипти, що визначають реальний IP відвідувача. Однак, мало хто може пояснити, що зберігається в даній змінної.

Якщо прописати даний код у себе в сайті на локальному сервері, то ви взагалі отримаєте порожнє значення, тобто даної змінної в масиві $ _SERVER у вас не виявиться. І це не дивно, тому що в HTTP_CLIENT_IP зберігається глобальний IP користувача, тобто його адресу в мережі Інтернет.

І, найголовніше, що на це значення не впливає проксі з'єднання, тобто тут ви знайдете реальний IP користувача, а не його проксі сервера.

Якщо з якихось причин дана змінна буде відсутній в PHP $ _SERVER, то можете спробувати дізнатися IP адресу клієнта ще й таким способом:

Якщо з якихось причин дана змінна буде відсутній в PHP $ _SERVER, то можете спробувати дізнатися IP адресу клієнта ще й таким способом:

<? Php echo $ _SERVER [ 'HTTP_X_FORWARDED_FOR']; ?>

До цієї змінну проксі сервера самі поміщають реальний IP відвідувача.

Таким чином, для того, щоб в PHP дізнатися IP клієнта гарантовано, можна використовувати наступну конструкцію:

<? Php $ client = @ $ _ SERVER [ 'HTTP_CLIENT_IP']; $ Forward = @ $ _ SERVER [ 'HTTP_X_FORWARDED_FOR']; $ Remote = @ $ _ SERVER [ 'REMOTE_ADDR']; if (filter_var ($ client, FILTER_VALIDATE_IP)) $ ip = $ client; elseif (filter_var ($ forward, FILTER_VALIDATE_IP)) $ ip = $ forward; else $ ip = $ remote; echo $ ip; ?>

Даний скрипт виведе на екран значення змінної $ ip, в яку при використанні проксі з'єднання буде записаний глобальний IP відвідувача. Якщо ж її буде знайдено в PHP $ _SERVER, то скрипт спробує дізнатися IP користувача, записаний самим проксі сервером.

Якщо ж ні однієї змінної не буде присвоєно значення, то з великою ймовірністю можна припустити, що відвідувач не використовує проксі або проксі сервер не надає реальний IP відвідувача. У цьому випадку, щоб отримати хоч якесь значення IP, ми беремо його з REMOTE_ADDR. Але, з високою часткою ймовірності, це значення буде IP адресою проксі сервера (благо, що ними не користується абсолютно кожен клієнт сайтів).

Для перевірки існування значень змінних я, як бачите, вирішив скористатися PHP функцією filter_var, яка фільтрує змінні із застосуванням певного фільтра (шаблона), яким в даному випадку є FILTER_VALIDATE_IP.

На завершення хочу підсумувати, що описаним вище способом, незважаючи на всі ретельні перевірки всіх можливих серверних змінних PHP, визначити IP користувача з використанням проксі все одно не вийде на 100%.

Справа в тому, що IP адреса клієнта надають тільки певний тип проксі серверів, які називають «прозорими». Як правило, це відкриті служби.

Якщо ж ваш користувач вирішив приховати свій реальний IP за допомогою комерційного непрозорого проксі, то шанси дізнатися його реальну адресу прагнуть до нуля. Благо, що відсоток таких клієнтів зовсім невеликий, так що наведена фінальна версія скрипта допоможе вам в більшості випадків.

Залишайте свої відгуки в коментарях - що сподобалося, що немає, може бути, про щось слід було б розповісти детальніше ... Мені цікаво будь-яке ваше думка.

До нових зустрічей 🙂

PS: якщо вам потрібен сайт або необхідно внести правки на існуючий, але для цього немає часу і бажання, можу запропонувати свої послуги.

Більше 5 років досвіду професійної розробки сайтів. Робота з PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular і іншими технологіями web-розробки.

Досвід розробки проектів різного рівня: Лендінзі, корпоративні сайти, Інтернет-магазини, CRM, портали. У тому числі підтримка і розробка HighLoad проектів. Надсилайте ваші заявки на email [email protected] .

І з друзями не забудьте поділитися 😉

Php echo $ _SERVER [ 'SERVER_ADDR']; ?
Php echo $ _SERVER [ 'REMOTE_ADDR']; ?
Php echo $ _SERVER [ 'HTTP_CLIENT_IP']; ?
Php echo $ _SERVER [ 'HTTP_X_FORWARDED_FOR']; ?

Дополнительная информация

rss
Карта