Сессия php адрес ip

Защита идентификатора сессий в PHP

Безопасность веб-сайтов основывается на управлении сессиями. Когда пользователь подключается к безопасному сайту, он предоставляет учетные данные, как правило, в форме имени пользователя и пароля. Веб-сервер не имеет представления о том, какой пользователь уже вошел в систему и как он переходит от страницы к странице. Механизм сессий позволяет пользователям не вводить пароль каждый раз, когда они хотят выполнить новое действие или перейти к новой странице.

В сущности, управление сессией гарантирует, что в настоящее время соединен тот пользователь, который проходил авторизацию. Но, к сожалению, сессии стали очевидной мишенью для хакеров, поскольку они могут позволить получить доступ к веб-серверу без необходимости проверки подлинности.

После аутентификации пользователя, веб-сервер предоставляет ему идентификатор сессии. Этот идентификатор хранится в браузере и подставляется всякий раз, когда нужна проверка подлинности. Это позволяет избежать повторяющихся процессов ввода логина/пароля. Все это происходит в фоновом режиме и не доставляет дискомфорта пользователю. Представьте, если бы вы вводили имя и пароль каждый раз, когда просматривали новую страницу!

В данной статье я постараюсь изложить все известные мне способы защиты идентификатора сессии в PHP.

По умолчанию вся информация о сессии, включая ID, передается в cookie. Но так бывает не всегда. Некоторые пользователи отключают cookie в своих браузерах. В таком случае браузер будет передавать идентификатор сессии в URL.

Читайте также:  Заголовок страницы

Здесь ID передается в открытом виде, в отличие от сессии через cookie, когда информация скрыта в HTTP-заголовке. Самым простым способом защиты от этого будет запрет передачи идентификатора сессии через адресную строку. Сделать это можно, прописав следующее в конфигурационном файле Apache-сервера .htaccess:

php_flag session.use_only_cookies on

Использование шифрования

Если на вашем сайте должна обрабатываться конфиденциальная информация, такая как номера кредитных карт (привет от Sony), следует использовать SSL3.0 или TSL1.0 шифрование. Для этого при установке cookie следует указывать true для параметра secure.

Если вы храните пароль сессии в переменной $_SESSION (все-таки лучше использовать sql), то не стоит хранить его в открытом виде.

if ($_SESSION['password'] == $userpass) < // код >

Приведенный выше код не безопасный, так как пароль хранится в виде обычного текста в переменной сессии. Вместо этого используйте md5-шифрование, примерно так:

if ($_SESSION['md5password'] == md5($userpass)) < // код >

Проверка браузера

Чтобы отсечь возможность использования сессии с другого браузера (компьютера), следует ввести проверку поля HTTP-заголовка user-agent:

session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) < if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) < // код >> else

Срок действия сессии

Ограничьте время жизни сессии, а также время действия cookie. По умолчанию срок действия сессии 1440 секунд. Изменить это значение можно через php.ini и .htaccess. Пример для .htaccess:

# Время жизни сессии в секундах
php_value session.gc_maxlifetime 3600
# Время жизни куки в секундах
php_value session.cookie_lifetime 3600

Привязка по IP-адресу

В определенных ситуациях (не всегда) следует установить привязку по IP-адресу. В основном когда количество пользователей ограничено и имеют статичные IP. Проверка может быть либо по списку разрешенных IP-адресов,

include ("ip_list.php"); //$ip_white_list = array ( 'admin1' => '111.222.333.444', 'admin2' => '555.666.777.888'); if(!empty(array_search($_SERVER['REMOTE_ADDR'],$ip_white_list))) < header("Location: admin.php"); >else

либо по IP-адресу для каждого запроса (только для статичных IP):

if(isset($_SESSION['ip']) and $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) < header("Location: admin.php"); >else

Следует осознавать, что полностью избежать взлома невозможно. Можно только максимально усложнить этот взлом любыми известными способами. Однако следует также не забывать о своих легальных пользователях, чтобы не осложнить им жизнь такой защитой.

Источник

Как в PHP узнать IP пользователя и определить его страну?

Как в PHP узнать IP пользователя и определить его страну?

Получить IP адрес клиента в PHP можно через суперглобальный массив $_SERVER . В этом массиве IP адрес посетителя доступен через ключ REMOTE_ADDR .

// сохраним в переменную ip значение IP адреса клиента $ip = $_SERVER['REMOTE_ADDR'];

Но, если клиент использует прокси-сервер, то значение $_SERVER[‘REMOTE_ADDR’] будет содержать IP последнего прокси-сервера, через который клиент попал на сайт.

В этом случае, чтобы узнать IP посетителя можно попробовать использовать $_SERVER[‘HTTP_CLIENT_IP’] и $_SERVER[‘HTTP_X_FORWARDED_FOR’] . HTTP_CLIENT_IP и HTTP_X_FORWARDED_FOR – это заголовки, содержащие IP адрес пользователя. Данные заголовки устанавливает прокси-сервер. Обычно прокси-сервер устанавливает один из них. Данным в этих заголовках можно доверять, только если прокси-сервер надёжный. В противном случае, им доверять не стоит, т.к. их можно очень просто подделать. В этом случае лучше просто использовать $_SERVER[‘REMOTE_ADDR’] или сохранять в базу как $_SERVER[‘REMOTE_ADDR’] , так и заголовок, устанавливаемый прокси-сервером.

function getIp() { $keys = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR' ]; foreach ($keys as $key) { if (!empty($_SERVER[$key])) { $ip = trim(end(explode(',', $_SERVER[$key]))); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } } $ip = getIp(); // выведем IP клиента на экран echo 'ip = ' . $ip;

Определение страны по ip с помощью Sypex Geo

Основные шаги по созданию php скрипта, с помощью которого можно будет определять страну по ip:

1. Скачаем Sypex Geo для PHP и базу данных стран. Sypex Geo распространяется по лицензии BSD, т.е. является абсолютно бесплатным.

2. Распакуем архивы и загрузим на сервер файлы «SxGeo.php» и «SxGeo.dat». В качестве примера, создадим на сервере папку SxGeo и загрузим эти файлы в неё.

3. Создадим свой скрипт, например, «get_country_code.php».

4. Вставим в этот файл следующий код:

5. Включим файл «get_country_code.php» в другие скрипты, в которых нужно реализовать выполнение кода в зависимости от принадлежности ip посетителя к той или иной стране.

require_once 'SxGeo/get_country_code.php'; if ($country_сode === 'RU') { // код для посетителей из России. } else { // код для посетителей из других стран. }

Определение города по ip с помощью Sypex Geo

Для определения города, потребуется загрузить архив с базой данных городов для Sypex Geo, распаковать его и загрузить на сервер.

Скрипт в этом случае будет следующий:

get($ip); // также можно использовать следующий код // $SxGeo->getCity($ip); // широта $lat = $city['city']['lat']; // долгота $lon = $city['city']['lon']; // название города на русском языке $city_name_ru = $city['city']['name_ru']; // название города на английском языке $city_name_en = $city['city']['name_en']; // ISO-код страны $country_code = $city['country']['iso']; // для получения информации более полной информации (включая регион) можно осуществить через метод getCityFull $city = $SxGeo->getCityFull($ip); // название региона на русском языке $region_name_ru = $city['region']['name_ru']; // название региона на английском языке $region_name_en = $city['city']['name_en']; // ISO-код региона $region_name_iso = $city['city']['iso'];

Для автоматического обновления баз можно воспользоваться этим архивом. В этом архиве находится php скрипт. Этот скрипт необходимо настроить, т.е. указать в нём URL для скачивания базы и пути к файлам на сервере. После этого загрузить его на сервер и настроить его запуск по расписанию с помощью cron.

Определение страны и города по ip через сервис через сервис ipstack

Рассмотрим ещё один вариант определения в php местоположения по ip посетителя, но уже не через Sypex Geo, а с помощью сервиса ipstack.

Сервис ipstack имеет бесплатный план, который позволяет обрабатывать до 10000 запросов в месяц.

Планы сервиса ipstack для определения страны и города посетителя по его ip

Для получения бесплатного плана нажимаем на кнопку «GET FREE API KEY» и переходим на страницу, на которой нужно заполнить регистрационную карточку.

После регистрации, на личной странице ipstack вам будет назначен «API Access Key», который нужно скопировать. Он нам потребуется при создании php скрипта.

Как в PHP получить IP адрес сервера

Узнать IP адрес сервера в PHP можно с помощью следующей инструкции:

// сохраним IP адрес сервера в переменную $ip_server $ip_server = $_SERVER['SERVER_ADDR']; // выведем IP адрес сервера на экран $echo $ip_server;

Пример реализации определения локации в CMS MODX

В качестве примере рассмотрим, как в CMS MODX Revolution можно очень просто без сторонних сервисов осуществить определение страны посетителя. Разработаем решение на базе Sypex Geo.

1. Для этого сначала нужно загрузить Sypex Geo в проект:

Загрузка библиотеки Sypex Geo в проект на CMS MODX Revolution с помощью которой организуем определение страны посетителя по его ip

Файл «SxGeo.php» – это основной скрипт, а «SxGeo.dat» – это база стран. Этих двух файлов достаточно для определения страны пользователя по его ip. Дополнительно в каталоге SxGeo ещё расположен файл «SxGeoCity.dat», данный файл в текущей реализации не нужен, он может потребовать, если в проекте потребуется определять не только страну пользователя, а ещё его регион и город.

2. Создадим сниппет, например «get_location.php». В качестве примера организуем это с помощью файлов. Для этого нужно чтобы был установлен pdoTools и в настройках включена опция «Использовать Fenom на страницах».

Код сниппета «get_location.php»:

getCountry($ip); unset($SxGeo); $modx->setPlaceholder('countrycode', $country); return;

Поместим файл «get_location.php» в каталог /core/elements/snippets/ .

Данный сниппет будет определять страну и помещать его код в плейсхолдер countrycode .

3. После этого в нужных шаблонах поместим код вызова сниппета и сохранение значение плейсхолдера countrycode в переменную $country_code .

{$_modx->runSnippet('@FILE snippets/get_location.php')} {set $country_code = $_modx->getPlaceholder('countrycode')}

Всё теперь чтобы написать логику достаточно использовать эту переменную.

{if $country_code === 'UA'} Код для Украины {else} Код для других стран {/if}

Источник

Оцените статью