Проверка данных с помощью хеширования

Задача
Необходимо не дать возможности пользователям изменять данные, посланные им в cookie или в элементе формы.

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

Покажем, как напечатать хеш в скрытом поле формы:

$secret_word = 'flyingturtle';
$id = 2836;
$hash = md5($secret_word . $id);
print<<<_HTML_
_HTML_;

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

$secret_word = 'flyingturtle';
if (md5($secret_word . $_REQUEST['id']) == $_REQUEST['idhash']) {
$id = $_REQUEST['id'];
} else {
die("Invalid data in $_REQUEST[id]");
}

Обсуждение
При обработке информации представленной формы вычислите хеш представленного значения $_REQUEST['id'] и секретного слова.


Если он совпадает с представленным хешем, то значение переменной $_REQUEST['id'] не было изменено пользователем. Если хеши не совпадают, то понятно, что принятое значение переменной $_REQUEST['id'] не совпадает с тем значением, которое вы послали.

Чтобы использовать проверочный хеш с cookie, добавьте хеш к значению cookie с помощью функции join():

$secret_word = 'flyingturtle';
$cookie_value = 'Ellen';
$hash = md5($secret_word . $id);
setcookie('name',join('|',array($cookie_value,$hash)));

Выделите хеш из значения cookie с помощью функции explode():

$secret_word = 'flyingturtle';
list($cookie_value,$cookie_hash) = explode('|',$_COOKIE['name'],2);
if (md5($secret_word . $cookie_value) == $cookie_hash) {
$name = $cookie_value;
} else {die('Invalid data in $_COOKIE[name]');
}

Использование хеша для проверки информации в форме или cookie, очевидно, зависит от секретного слова, использованного при вычислении хеша. Если злонамеренный пользователь вскроет ваше секретное слово, то хеш не обеспечит защиты. Помимо тщательной защиты секретного слова, целесообразно почаще менять его.


Можно обеспечить дополнительный уровень защиты, если выбирать для использования в хеше различные секретные слова, применяя специфические варианты, основанные на некоторых свойствах значения переменной $id (например, 10 различных слов, выбранных с помощью $id%10). Таким образом можно помешать взлому, если одно из слов стало известным. Если инсталлирован модуль mhash, то вы не ограничены хешами типа MD5. Модуль mhash поддерживает несколько алгоритмов хеширования. Более подробную информацию о модуле mhash можно найти в разделе mhash в оперативной справке по PHP или на домашней страничке модуля mhash на http://mhash.sourceforge.net/.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Не храните пароли на своем сайте
Обнаружение SSL-соединения
Проверка надежности пароля
Работа с потерянными паролями
Совместное использование зашифрованных данных с другим веб-сайтом

Вернуться в раздел: PHP / 14. Шифрование и безопасность