PHP: правильная настройка файлов cookie для входа - PullRequest
0 голосов
/ 29 декабря 2011
    if (strtolower($userDetail["username"]) == strtolower($username) && 
        $userDetail["password"] == hash("sha256", $password . $userDetail["salt"])) {       
        if ($remember == "true") { // Remember Me
            setcookie("logged", "$username", time()+60*60*24*365); // 1 Year
        } else {    
            setcookie("logged", "$username", time()+43200); // 12 Hours
        }
        header("Location: " . getenv("HTTP_REFERER"));
        die();
    } else {
        echo "Invalid login.";
    }

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

  1. Что я должен настроить для своего cookie, чтобы кто-то не мог легко скопировать cookie?
  2. Должен ли я включать соль в печенье?
  3. Я слышал о токенах в дополнение к солям и их постоянному изменению.Как это должно работать?

И мне интересно, является ли этот вызов для моего файла cookie выше действительным?Как правильно это делать?

$loginCheck = $_COOKIE["logged"];
if (isset($loginCheck)) {
    // logged in
}

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Я хотел бы оставить имя пользователя без изменений, а другой файл cookie установить как sha1(salt . user . pass)

Например:

user=Truth
uid=6cb8d1e35e5982a8ef738a8583a5d98d6fe2c484

А затем сравните, используя первый файл cookie, с базой данных и известным хешем.

То, как вы делаете это в данный момент, любой может скопировать cookie и войти в систему с кем угодно, даже не зная своих паролей. Просто установите

logged=Admin expires Jan 1st 5000

И ты в порядке. Если у вас есть второй файл cookie для сравнения, вы становитесь намного безопаснее.


Что касается третьего вопроса, да, вы можете даже сократить его до:

if (isset($_COOKIE["logged"])) {

Но, как я уже сказал, вы должны перейти к более безопасному формату, который я показал.


См. Абсолютно EPIC Tutorial на net.tutsplus.com для получения дополнительной информации по этому вопросу.

0 голосов
/ 29 декабря 2011

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

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

<?php
/* A uniqid, like: 4b3403665fea6 */
printf("uniqid(): %s\r\n", uniqid());
?>

Справочник по использованию uiqid: http://php.net/manual/en/function.uniqid.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...