Как защитить cookie аутентификации без SSL

Я нахожусь в процессе создания системы входа в систему, которая использует оба сеанса (для тех, кто запрещает использование файлов cookie (чтобы согласиться с законом cookie .. Я использую сайт http://www.cookielaw.org/the-cookie -law.aspx в качестве ссылки)

Теперь у меня есть эта система для проверки подлинности в cookie

function GenerateString(){ $length = mt_rand(0,25); $characters = '0123456789abcdefghijklmnopqrstuvwxyz'; $string = ''; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(5, strlen($characters) -1)]; } return $string; } $RandomString = GenerateString(); $CookieAuth = $DB->prepare("INSERT INTO cookieauth (Username,RandomString) VALUES (?,?)"); $CookieAuth->bind_param('ss',$_POST['Username'],$RandomString); $CookieAuth->execute(); // Insert the Authentication Methods into the database $CookieAuth->close(); // Allow another query/statement $GetInsertID = $DB->prepare("SELECT ID FROM CookieAuth WHERE RandomString=?"); $GetInsertID->bind_param('s',$Randomstring); $GetInsertID->execute(); $GetInsertID->bind_result($RowID); $GetInsertID->fetch(); $GetInsertID->close(); setcookie("Auth[ID]",$RowID); setcookie("Auth[UName],$_POST['Username']); setcookie("Auth[RandomString]",$RandomString); 

Затем обработать файл cookie:

 if(isset($_COOKIE['Auth'])){ $Authenticate = $DB->prepare("SELECT Username,RandomString FROM cookieauth WHERE ID=?"); $Authenticate->bind_param('i',$_COOKIE['Auth']['ID']); $Authenticate->execute(); $Authenticate->bind_result($RowUsername,$RowString); $Authenticate->fetch(); $Authenticate->close(); if ($_Cookie['Auth']['UName'] == $RowUsername){ if ($_COOKIE['Auth']['RandomString'] == $RowString){ header("Location: LoggedIn.php"); }else{ die("Possible Cookie Manipulation, Autologin Cannot Continue"); } }else{ die("Possible Cookie Manupulation, Autologin Cannot Continue!"); } 

Моя общая цель – предоставить функцию автоматического входа в систему с помощью файлов cookie. Поскольку люди должны знать, что они по существу хранятся на жестком диске в виде обычного текста. Итак, если я включаю произвольно сгенерированную строку, которая будет изменяться при дальнейшей обработке каждый раз (тогда обновление файла cookie в соответствии с базой данных), это достаточно безопасный способ для достижения этой задачи? Я имею в виду, я понимаю, что это не на 100% безопасно из-за того, что некоторые пользователи могут пытаться манипулировать случайной строкой, поэтому я мог бы прибегнуть к соли, случайный ключ, а затем использовать hash_hmac для sha512 соль + ключ и сохранить это как файл cookie. ..

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

Related of "Как защитить cookie аутентификации без SSL"

Введение

Почему вы хотите аутентифицировать cookie, когда именно это происходит? Если вы хотите изменить ID вы можете легко достичь этого с помощью session_regenerate_id как указал @MarcB.

Мои предположения

Я хочу предположить, что я не понял этот вопрос четко и, вероятно, это то, чего вы хотите достичь

  • Сохранить значения в файле cookie
  • Знайте, были ли эти значения изменены

Вы решили это уже

Я мог бы прибегнуть к соли, случайный ключ, а затем использовать hash_hmac для sha512 соль + ключ и сохранить это как cookie …

Это именно то решение, но нужно отметить, что

  • Сессия может быть уничтожена
  • PHP имеет лучшие способы генерации случайных строк
  • Представьте, что накладные расходы должны обновлять вашу таблицу mysql каждый раз, когда что-то сеансы могут легко сделать для вас
  • использование hash_hmac 512 будет генерировать 126 в шестнадцатеричном формате, вам нужно понять, что есть ограничения Cookie для браузера, поэтому я предлагаю вам уменьшить его до 256

Ваше решение изменено

Если мы собираемся использовать ваше решение, нам нужна небольшая модификация

 session_start(); // Strong private key stored Securly stored // Used SESSION For demo $privateKey = isset($_SESSION['key']) ? $_SESSION['key'] : mcrypt_create_iv(128, MCRYPT_DEV_URANDOM); $my = new SignedCookie($privateKey); $my->setCookie("test", "hello world", time() + 3600); echo $my->getCookie("test"); 

Вывод

  hello world 

Но данные хранились следующим образом:

введите описание изображения здесь

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

 10 Cookies = AAAA 1 Cookie = BBBB 

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

Вы также можете удалить файлы cookie следующим образом:

  $my->setCookie("test", null, time() - 3600); 

Простой класс

 class SignedCookie { private $prifix = '$x$'; private $privateKey; function __construct($privateKey) { $this->privateKey = $privateKey; } function setCookie($name, $value, $expire, $path = null, $domain = null, $secure = null, $httponly = null) { $value = $value === null ? $value : $this->hash($value, mcrypt_create_iv(2, MCRYPT_DEV_URANDOM)); return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); } function getCookie($name, $ignore = false) { if (! isset($_COOKIE[$name]) || empty($_COOKIE[$name])) return null; // does not exist if ($ignore === false) { if (substr($_COOKIE[$name], 0, 3) !== $this->prifix) return - 1; // modified $data = pack("H*", substr($_COOKIE[$name], 3)); // Unpack hex $value = substr($data, 32, - 2); // Get Value $rand = substr($data, - 2, 2); // Get Random prifix if ($this->hash($value, $rand) !== $_COOKIE[$name]) return - 1; // modified return $value; } return $_COOKIE[$name]; } function hash($value, $suffix) { // Added random suffix to help the hash keep changing return $this->prifix . bin2hex(hash_hmac('sha256', $value . $suffix, $this->privateKey, true) . $value . $suffix); } } 

Вывод

Вы не эксперт по безопасности Просто используйте так, чтобы использовать SSL (у SSL также есть свои проблемы, но гораздо лучше ) или искать существующую службу проверки подлинности. @ircmaxell недавно напомнил мне Закон Шнайера :

@Baba: «сюрприз» – это враг безопасности. Единственная вещь, которая должна быть секретной, – это закрытый ключ. Помните Закон Шнайера: любой может изобрести схему шифрования, которую они сами не могут сломать. Мой ответ основан на проверенных и настоящих криптографических принципах.

хорошо, я думаю, что вы должны принять этот совет тоже.