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'));
Все зависит от вашей фантазии. Можно вообще так, для полного счастья:
Подобные "ключи" можно разделить на случайно сгенерированные и полученные преобразованием из чего-то другого. От типа будет зависеть и способ применения и способ создания.
Например, это может быть хеш пароля. Пользователь вводит пароль, система его обрабатывает. Результат хранит в базе. В итоге можно проверить, правильно ли введён пароль снова (сверяем хеш-код введённого пароля с сохранённым кодом), но нельзя увидеть сам пароль. Цель понятна - безопасность хранения данных доступа к аккаунту.
Случайный код может пригодиться, когда нужно, например, идентифицировать пользователя в процессе регистрации. Наверняка сталкивались с проверочными кодами, которые отправляются по почте. Получить такой код можно любым из механизмов рандомизации.
Вариантов как создания, так и применения может быть очень и очень много. Нужно рассматривать конкретный случай. И решать конкретную задачу.