Шаг 6 - MD5 панацея от всех болезней

Хочу рассказать Вам о лекарстве от всех бед, которое недавно я начал применять в большинстве скриптов. Если Вы не знаете, что такое MD5 сумма, то почитайте что-нибудь про это в интернете. Из собственных наработок краткий экскурс дается в "Шаг 18 - Генерация хешей MD2, MD4, MD5 с помощью OpenSSL".

Итак, функция вычисления хеша данных MD5. Работает в PHP передельно просто:

<?php
echo "Это хеш MD5 для слова \"abcdefgh\" = \"",md5("abcdefgh"),"\"";
?>

Выведет:

Это хеш MD5 для слова "abcdefgh" = "e8dc4081b13434b45189a720b77b6818"

И в чем же смысл использования md5()? Это контроль целостности данных, которые Вы сами должным образом подготовили. Боюсь углубиться в объяснения, но попробую как-то попроще. Вот для примера простейший пример. Вы делаете список ссылок на какие-то страницы, таким кодом:

<?php
for ($i=0; $i < 10; $i++) {
	echo "<br><a href=page_content.php?page_id=",$i,
	">Содержимое страницы ",$i,"</a>";
};
?>

У Вас появляется набор ссылок вида page_content.php?page_id=N, где N - идентификатор страницы. Отлично. По этому идентификатору Вы запрашиваете в базе данных содержимое и выдаете пользователю. Но, теперь напомню о принципе "недоверяй пользователю", по которому нам нужно идентификатор page_id провести через ряд тестов, которые нам сказали бы о том, что идентификатор верный. Ведь запрос может быть создан хакером, который пытается получить доступ к какой-нибудь другой странице, возможно содержащую скрытую информацию. Теперь приведу пример кода, защищенный от ненужных посягательств. Вывод ссылок делаем так:

<?php
$our_secret = "наш секрет";

for ($i=0; $i < 10; $i++) {
	echo "<br><a href=page_content.php?page_id=",$i,
	"&md5=",md5("page_id=".$i."+".$our_secret),">Содержимое страницы ",$i,"</a>";
};
?>

Теперь сылки выглядят так:

page_content.php?page_id=0&md5=ad144b035d6b920aa88ddaaa07ba2387
page_content.php?page_id=1&md5=3eca41b4bb6f62ddfa02c9661d1abb29
page_content.php?page_id=2&md5=e523de7061e2b3c1107078d4621793c7
page_content.php?page_id=3&md5=d173b6361b2474677836d97d9afc8898
page_content.php?page_id=4&md5=58a83827d7d08b646f87132e4f76147c
...

А код внутри page_content.php для проверки такой:

<?php
$our_secret = "наш секрет";

if (isset($_REQUEST["page_id"])) {
    $page_id = (integer) $_REQUEST["page_id"];
} else $page_id = 0;

if (isset($_REQUEST["md5"])) {
    $md5 = $_REQUEST["md5"];
} else $md5 = "";

if (md5("page_id=".$page_id."+".$our_secret) != $md5) {
    echo "Ошибка целостности данных !";
    exit;
};

echo "OK";
?>

До этого я не придумывал возможный код для страницы page_content.php, но скорее всего он бы содежал какие-то дополнительные сравнения и возможно даже запросы к базе данных. Это сильно замедляет и усложняет проверку переданных данных. А проверка целостности данных с помощью md5() свела всю процедуру проверки к одному if. Очень упрощает жизнь и разработку.

Этот же подход Вы можете использовать в сложных формах, которые Вы создаете с помощью программы для защиты скрытых полей содержащих идентификаторы или какие-то сложные для проверки данные, например IP и MAC адреса, какие-то закодированные пути, деревья и т.д.

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей - 13.12.2006