PHP « Секретный ключ генерируемый уникально для каждого пользователя

На некоторых сайтахдвижках можно встретить так называемый "секретный" ключ, который генерируется автоматом.
Например в Livestreet это LIVESTREET_SECURITY_KEY.
В punbb заметил csrf_token при редактировании форм насколько понял.
Собственно вопрос в том, каким образом это работает и как реализуется? В каких случаях это нужно применять и т.д...?

ps. прошу прощения. скорее это не "секретный ключ", а "ключ безопасности".

1 ответов


Это защита на от CSFR атак. Вот пример: на одном сайте(site1.ru) уставлена система LiveStreet, там есть форма добавления поста. (Представим, что там нет этого скрытого поля с анти-CSRF защитой).

Какой-нибудь злой хакер решил обмануть добросовесного пользователя и опубликовать от его имени какой-нибудь злой пост. Он создает форму ведущую на сайт livestret состоящую из скрытых полей(имена которых совпадают с именами в поле ввода на сайте livestret) и видимую кнопку с текстом, к примеру "Хочу бабла!".

Пользователь нажимает и тем самым создает запрос на сайт livestreet, этот запрос абсолютно идентичен тому, что отправил бы сам пользователь, но с сайта(т.е. легальным образом). Соответственно, от имени пользователя опубликуется какой-нибудь злой пост. Вот и все. Для этого сделана такая технология.

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


$key = md5($_SERVER['REMOTE_ADDR'] . date('d.m.Y') . 'salt');
 

Затем при получении запроса на сервере проводим его проверку:

if($_POST['hidden_val'] == md5($_SERVER['REMOTE_ADDR'] . date('d.m.Y') . 'salt')) {
  // все верно
} else {
  // неверно, юзера хотят нае*ать
}
 

Вот и все. А реализаций, я вам могу показать сколько угодно:

$key = md5($_SERVER["HTTP_USER_AGENT"] . date('d.m.Y H'));
 
Или вот:

$key = base64_encode(sha1(md5($_SERVER['REMOTE_ADDR'] . 'salt') . $_SERVER["HTTP_USER_AGENT"] . 'slat2'));
 

Все зависит от вашей фантазии. Можно вообще так, для полного счастья:

$hash = md5($_SERVER['REMOTE_ADDR'] . 'salt');

for ($i = 1; $i <= 10; $i++)  { // 10 раз хешируем запись, для надежности
  $hash = md5(sha1($hash));
}
 

Дерзайте!

Подобные "ключи" можно разделить на случайно сгенерированные и полученные преобразованием из чего-то другого. От типа будет зависеть и способ применения и способ создания.

Например, это может быть хеш пароля. Пользователь вводит пароль, система его обрабатывает. Результат хранит в базе. В итоге можно проверить, правильно ли введён пароль снова (сверяем хеш-код введённого пароля с сохранённым кодом), но нельзя увидеть сам пароль. Цель понятна - безопасность хранения данных доступа к аккаунту.

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

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



// сохраняем хэш пароля в базу при регистрации
$password = md5(SECRET_KEY . $_POST['password'] )
 


// логин-флажок "Запомнить пароль"
// my_encrypt <-> my_decrypt - обратимое шифрование
setcookie( 'password', my_encrypt( $_POST['password'], SECRET_KEY ));