У меня есть базовый код, который я размещаю в заголовке каждой страницы, чтобы убедиться, что пользователь вошел в систему. Я надеялся, что кто-то может взглянуть на него и дать мне несколько советов:
if ($_SESSION['logged_in'] == 1) { $handle = dbconnect::init; $result = $handle->select()->from('session_id') ->where('session_id=?', $_SESSION['SID']) ->columns('ip'); $check = $result->fetchAll(); if ($check[0]->ip != $_SERVER['REMOTE_ADDR']) { //user has changed networks // or someone is trying // to switch cookies on us return false; } } else { return false; }
Благодаря!
function checkLoggedIn () { // Return early if we are not logged in. Also, by using empty we // avoid warnings of the 'undefined index' kind. if (empty($_SESSION['logged_in'])) { return false; } $handle = YourDbClass::getConnection(); $result = $handle->select()->from('session_id') ->where('session_id=?', $_SESSION['SID']) ->columns('ip'); $check = $result->fetchAll(); if ($check[0]->ip != $_SERVER['REMOTE_ADDR']) { //user has changed networks // or someone is trying // to switch cookies on us return false; } return true; }
Ваш код выглядит очень хорошо для меня. Я завернул его в функцию, поэтому вам не нужно дублировать ее на каждой странице, просто нужно использовать ваш util.php или что угодно, что вы хотите назвать своей библиотекой функций. Затем просто вызовите checkLoggedIn (). Если он возвращает false, пользователь не войдет в систему, и вы можете отправить страницу с ошибкой, выйти или что угодно. Если он вернет true, вы можете продолжить.
У вас есть особая потребность в том, чтобы вытащить удаленный ip из базы данных? Было бы проще хранить удаленный ip в _SESSION вместо того, чтобы беспокоить базу данных другим запросом.
Возможно, вы захотите предоставить пользователю возможность отключить эту функцию, поскольку они могут подключиться к вашему серверу через прозрачные прокси с изменением IP-адресов, например http://webmaster.info.aol.com/proxyinfo.html :
Запросы пользователей AOL для интернет-объектов обычно обрабатываются системой AOL Proxy. Когда член запрашивает несколько документов для нескольких URL-адресов, каждый запрос может поступать с другого прокси-сервера. Поскольку один прокси-сервер может иметь несколько членов, отправляющихся на один сайт, веб-мастера не должны делать предположений о взаимосвязи между членами и прокси-серверами при разработке своего веб-сайта.
nit picky: сначала вы должны проверить, есть ли хотя бы одна запись, прежде чем пытаться получить к ней доступ. Может быть что-то вроде:
if ( !isset($check[0]) || $check[0]->ip!=$_SERVER['REMOTE_ADDR'] )