2013-09-21 2 views
0

У меня возникла проблема с чем-то, что я уже разместил, но я подумал, что снова попробую проблему, так как у меня теперь есть больше кода.Проверка того, что пользователь уже зарегистрировался, cookie check

Исходный код, который я использовал для урока

function checkLoggedIn($page) 
{ 
    $loginDiv = ''; 
    $action = ''; 
    if (isset($_POST['action'])) 
    { 
     $action = stripslashes ($_POST['action']); 
    } 

    session_start(); 

    // Check if we're already logged in, and check session information against cookies 
    // credentials to protect against session hijacking 
    if (isset ($_COOKIE['project-name']['userID']) && 
     crypt($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'], 
      $_COOKIE['project-name']['secondDigest']) == 
     $_COOKIE['project-name']['secondDigest'] && 
     (!isset ($_COOKIE['project-name']['username']) || 
     (isset ($_COOKIE['project-name']['username']) && 
     Users::checkCredentials($_COOKIE['project-name']['username'], 
           $_COOKIE['project-name']['digest'])))) 
    { 
     // Regenerate the ID to prevent session fixation 
     session_regenerate_id(); 

     // Restore the session variables, if they don't exist 
     if (!isset ($_SESSION['project-name']['userID'])) 
     { 
     $_SESSION['project-name']['userID'] = $_COOKIE['project-name']['userID']; 
     } 

     // Only redirect us if we're not already on a secured page and are not 
     // receiving a logout request 
     if (!isSecuredPage ($page) && 
      $action != 'logout') 
     { 
     header ('Location: ./'); 

     exit; 
     } 
    } 
    else 
    { 
     // If we're not already the login page, redirect us to the login page 
     if ($page != Page::LOGIN) 
     { 
     header ('Location: login.php'); 

     exit; 
     } 
    } 

    // If we're not already logged in, check if we're trying to login or logout 
    if ($page == Page::LOGIN && $action != '') 
    { 
     switch ($action) 
     { 
     case 'login': 
     { 
      $userData = Users::checkCredentials (stripslashes ($_POST['login-username']), 
               stripslashes ($_POST['password'])); 
      if ($userData[0] != 0) 
      { 
       $_SESSION['project-name']['userID'] = $userData[0]; 
       $_SESSION['project-name']['ip'] = $_SERVER['REMOTE_ADDR']; 
       $_SESSION['project-name']['userAgent'] = $_SERVER['HTTP_USER_AGENT']; 
       if (isset ($_POST['remember'])) 
       { 
        // We set a cookie if the user wants to remain logged in after the 
        // browser is closed 
        // This will leave the user logged in for 168 hours, or one week 
        setcookie('project-name[userID]', $userData[0], time() + (3600 * 168)); 
        setcookie('project-name[username]', 
        $userData[1], time() + (3600 * 168)); 
        setcookie('project-name[digest]', $userData[2], time() + (3600 * 168)); 
        setcookie('project-name[secondDigest]', 
        DatabaseHelpers::blowfishCrypt($_SERVER['REMOTE_ADDR'] . 
               $_SERVER['HTTP_USER_AGENT'], 10), time() + (3600 * 168)); 
       } 
       else 
       { 
        setcookie('project-name[userID]', $userData[0], false); 
        setcookie('project-name[username]', '', false); 
        setcookie('project-name[digest]', '', false); 
        setcookie('project-name[secondDigest]', 
        DatabaseHelpers::blowfishCrypt($_SERVER['REMOTE_ADDR'] . 
               $_SERVER['HTTP_USER_AGENT'], 10), time() + (3600 * 168)); 
       } 

       header ('Location: ./'); 

       exit; 
      } 
      else 
      { 
       $loginDiv = '<div id="login-box" class="error">The username or password ' . 
          'you entered is incorrect.</div>'; 
      } 
      break; 
     } 
     // Destroy the session if we received a logout or don't know the action received 
     case 'logout': 
     default: 
     { 

      // Destroy all session and cookie variables 
      $_SESSION = array(); 
      setcookie('project-name[userID]', '', time() - (3600 * 168)); 
      setcookie('project-name[username]', '', time() - (3600 * 168)); 
      setcookie('project-name[digest]', '', time() - (3600 * 168)); 
      setcookie('project-name[secondDigest]', '', time() - (3600 * 168)); 

      // Destory the session 
      session_destroy(); 

      $loginDiv = '<div id="login-box" class="info">Thank you. Come again!</div>'; 

      break; 
     } 
     } 
    } 

    return $loginDiv; 
} 

Мой код:

<?php 

function encrypt($input) 
{ 
$hash = password_hash($input, PASSWORD_DEFAULT); 
return $hash; 
} 

function checkUserCreds($username, $password) 
{ 
    $id = 0; 
    $hash = ''; 

    $db = new PDO('$dbDNS', '$dbuser', '$dbpass'); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Set error mode 
    try 
    { 
     $st = $db->prepare("SELECT id, login, email, pass FROM users WHERE login =:username");  
     $st->bindParam(':username', $username, PDO::PARAM_STR); 
     $success = $st->execute(); 

     if($success) 
     { 
      $userData = $st->fetch(); 
      $hash = $userData['pass']; 
      if (password_verify($password, $hash) == $hash) 
      { 
       $id = $userData['id']; 
      }   
     } 

    } 
    catch (PDOException $e) 
    { 
     $id = 0; 
     $hash = ''; 
    } 
    $db = null; 

    return array ($id, $username, $hash); 
} 

function checkLoggedIn($page) 
{ 
    $loginMess=''; 
    $action=''; 
    if (isset($_POST['action'])) 
    { 
     $action = stripslashes($_POST['action']); 
    } 
    session_start(); 

    //Check if already logged in and check session information against cookies 
    if (isset($_COOKIE['sukd']['id']) && encrypt($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) == $_COOKIE['sukd']['hashv2'] && (!isset ($_COOKIE['sukd']['username']) || (isset ($_COOKIE['sukd']['username']) && checkUserCreds($_COOKIE['sukd']['username'], $_COOKIE['sukd']['hash'])))) 
    { 
     echo "isset cookies: ON, GOOD <br>"; 
     // Regenerate the ID to prevent session fixation 
     //session_regenerate_id(); 
    } 
    else 
    { 
     // If we are not on the login page, redirect. 
     if ($page != 'login') 
     { 
      header ('Location login.php'); 
      exit; 
     } 
    } 
    if ($page = 'login' && $action != '') 
    { 
     switch($action) 
     { 
      case 'login': 
      { 
       $userData = checkUserCreds(stripslashes($_POST['username']), stripslashes($_POST['password'])); 

       if ($userData[0] != 0) 
       { 
        $_SESSION['sukd']['id']=$userData[0]; 
        $_SESSION['sukd']['ip']=$_SERVER['REMOTE_ADDR']; 
        $_SESSION['sukd']['userAgent']=$_SERVER['HTTP_USER_AGENT']; 
        if(isset($_POST['remember'])) 
        { 
         //remember for 7 days 
         setcookie('sukd[id]', $userData[0], time() + (3600 * 168)); 
         setcookie('sukd[username]', $userData[1], time() + (3600 * 168)); 
         setcookie('sukd[hash]', $userData[2], time() + (3600 * 168)); 
         setcookie('sukd[hashv2]', encrypt($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']), time() + (3600 * 168)); 
        } 
        else 
        { 
         setcookie('sukd[id]', $userData[0], false); 
         setcookie('sukd[username]', '', false); 
         setcookie('sukd[hash]', '', false); 
         setcookie('sukd[hashv2]', encrypt($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']), time() + (3600 * 168)); 
        } 

        header ('Location: ./'); 

        exit; 
       } 
       else 
       { 
        $loginMess = "The username or password you entered is incorrect <br>"; 
       } 
       break;    
      } 
      case 'logout': 
      default: 
      { 
       $_SESSION = array(); 
       setcookie('sukd[id]', '', time() + (3600 * 168)); 
       setcookie('sukd[username]', '', time() + (3600 * 168)); 
       setcookie('sukd[hash]', '', time() + (3600 * 168)); 
       setcookie('sukd[hashv2]', '', time() + (3600 * 168)); 

       session_destroy(); 

       $loginMess = "echo 'Successfully logged out <br>'"; 

       break;   
      }  
     } 
    } 
    return $loginMess; 
} 
?> 

Он вызывается checkLogged(login), например, и выводит сообщение входа в систему, если есть проблема. Кроме того, он использует скрытое поле с действием для установки значения, входа или выхода для переключателя case. В настоящее время он регистрируется в порядке, добавляет файлы cookie и т. Д.

Однако проблема в том, что когда пользователь уже выполнил вход в систему, он должен проверять код.

if (isset($_COOKIE['sukd']['id']) && encrypt($_SERVER['REMOTE_ADDR'] etc.. 

Я не мог действительно толковать оригинальный код, поэтому я даже не знаю, с чего начать. Массив файлов cookie немного странный, поскольку он, по-видимому, основан на двух разных версиях, основанных на том, установлен ли файл cookie или вызывается cookie.

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

Оригинал моего кода.

digest = hash 
decondDigest = hashv2 

ответ

2

Я бы не позвонил session_start(); в пределах функции. Если вы будете использовать файлы cookie где-нибудь еще, вам это все равно понадобится. Имейте это в начале вашего самого первого файла где-то раньше всего.

И возможно использовать это:

if (!isset($_SESSION)) 
    { 
    session_start(); 
    } 

Если кто-то имеет более безопасным, не превышая верхнего метода, я рад за кого-то просветить меня дальше по этому вопросу.

Почему бы не переключиться на $ _SESSIONs?

Использование куки-файлов абсолютно неудобно, чтобы попытаться сделать его безопасным, и поэтому пользователи не могут установить определенные данные самостоятельно, с которыми вы сейчас сражаетесь. Напротив, я не могу установить $ _SESSION на вашем сервере.

Затем на очень простом примере:

//your login script 
//if logged in successful: 
$_SESSION['loggedin']['username']=$username; //from DB 
$_SESSION['loggedin']['whatever']=$whatever; 

//Then your login check just checks the session 
if (!isset($_SESSION['loggedin'])) 
    { 
    //redirect to login page or don't server them user stuff 
    } 

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

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

Сессии, в то время как не на 100% безопасны в вене, которые ничего не представляют, довольно безопасны, поскольку они хранятся на сервере из корневого веб-сайта, что означает, что кто-то будет с ними играть, они уже будут на сервере, и настройка сессий - последнее, что им нужно сделать, чтобы вызвать хаос.

+0

Я бы предпочел использовать некоторые из них, я не думаю, что кто-то может легко использовать куки, поскольку я использовал смесь IP-адреса и HTTP-агента пользователя, который сам по себе хэширован и будет проверен на пользователя. Проблема в том, что я не могу разобраться с isset в учебнике, чтобы соответствовать моему. –

+0

Итак, если я установил файл cookie на своей машине с моим IP-адресом и HTTP-агентом пользователя, что вы проверяете? Просто, что он существует в cookie и соответствует моим? Как это проверка безопасности? Я бы установил свой собственный файл cookie с любыми параметрами '$ _SERVER ['REMOTE_ADDR']' и '$ _SERVER ['HTTP_USER_AGENT']'. Если это все, что вы делаете, тогда, когда я устанавливаю свой файл cookie и устанавливаю '['username']', я могу просто выбрать другое имя пользователя, и вы разрешите мне. – James

+0

Использование куки-файлов абсолютно затруднительно, чтобы попытаться сделать его безопасным и поэтому пользователи не могут установить определенные данные, с которыми вы сейчас сражаетесь. Напротив, я не могу установить '$ _SESSION' на вашем сервере. Сеанс в основном соответствует идентификатору в cookie на моей стороне, если на моей стороне нет совпадения cookie с сеансом на вашем сервере, тогда у меня нет сеанса (и т. Д.). – James

0

Обнаружил причину, по которой он не работал. Я переписывал using password_hash, когда я должен был использовать password_verify. Это означало, что каждый раз он выдавал другой ответ.

+0

отлично! Еще одна вещь, о которой стоит упомянуть здесь, если вы предоставляете опцию смены пароля, как только они вернутся к вашей учетной записи для входа, они не вошли в систему. Вам нужно обработать это чисто. Т.е. на странице изменения пароля обновите файл cookie до входа в систему (и т. Д.). (еще одна причина, по которой это делается так, как вы в настоящее время неудобно) – James

+0

Очень верно, я просто подумал, что это выглядит неплохо, некоторые из идей с $ action и подобными. Я только сделал это в java, но это выглядело довольно чисто. Пауза для размышлений, хотя при изменении пароля. Приветствия. –

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