Средством для проверки данных в рассматриваемом случае является алгоритм MD5. Этот алгоритм используется для создания дайджеста сообщения (вид цифровой подписи) из переданных ему данных. Как и подпись человека, цифровая подпись, создаваемая алгоритмом MD5, уникальна для строки. Несмотря на то что существует небольшая вероятность (1 из 3.40282е+38) того, что цифровые подписи двух строк совпадут, для практического использования можно считать, что они уникальны.
Цифровые подписи, создаваемые алгоритмом MD5, не только уникальны, но и предопределены. Для заданной строки алгоритм MD5 всегда создает одну и ту же цифровую подпись. В РНР использование алгоритма MD5 сводится к вызову функции md5 (), имеющей синтаксис: md5($string) где $string — строка, для которой нужно сгенерировать цифровую подпись. Функция md5 () возвращает 32-символьную подпись, основанную на данных, переданных в $string. Каким же образом функция md5 () помогает убедиться в том, что данные остаются неизменными в промежутке времени между созданием формы и ее передачей?
Создав МВ5-подписи для каждого скрытого элемента в документе и проверив эти подписи во время передачи формы, можно быть уверенным, что передаваемые данные достоверны.
При создании подписей MD5 важно помнить, что главное преимущество алгоритма одновременно является его недостатком. Поскольку алгоритм MD5 полностью предсказуем, простое использование некоторых комбинаций передаваемых параметров $name и $value может оказаться потенциально небезопасным. Например, рассмотрим следующий фрагмент:
$fingerprint = md5($name.$value);
Несмотря на то что $ fingerprint является цифровой подписью MD5, основанной на переданных параметрах, злоумышленник (достаточно внимательный) может с относительной легкостью определить строку, использованную для генерации цифровой подписи. Для того чтобы подпись MD5 была действительно безопасной, нужно использовать значение, полностью не известное внешнему пользователю: $fingerprint = md5($name.$value.'mysecretword');
При использовании этого метода злоумышленник должен не только разобраться в том, как была создана строка для алгоритма MD5, но и должен знать дополнительное значение. Для простоты, с помощью PHP-оператора define, определим константу PROTECTED_KEY для хранения секретного слова: define("PROTECTED_KEY", "mysecretword");
НА ЗАМЕТКУ
Когда константа определяется с использованием оператора define, она выглядит как обычная PHP-константа. Это значит, что на нее можно ссылаться как PROTECTED_KEY (без начального символа $) и она автоматически доступна в любой точке сценария, независимо от области видимости.
|