2009-06-11 4 views
1

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


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

Спасибо!

ответ

1
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, вы можете продолжить.

1

У вас есть особая потребность в том, чтобы вытащить удаленный 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'])

Смежные вопросы