Использование временного, вращающегося хэша или строки для обеспечения безопасности

В приложении CMS мне иногда нужно открыть iframe другого домена. На данный момент я устанавливаю URL для этого iframe в нечто очень неясное. Как http://domain.com/iframe/jhghjg34787386/ . Это работает, но теоретически, что URL-адрес источника iframe будет сохранен в истории пользователя и может быть доступен из внешнего мира.

Поэтому мне интересно использовать временный подход к постоянно меняющемуся хешу или строке, которая обрабатывается на стороне запроса и проверяется на стороне источника iframe. Однако я хотел бы, чтобы это было основано на времени.

Я мог бы сделать это, чтобы получить хэш:

<?php $seed = '123456789'; // a password that both the parent and source have $string = md5(time().$seed); ?> 

Но тогда два сервера должны быть точно синхронизированы. Любой способ сделать ограничение времени более нечетким?

Я также открыт для других подходов. Есть ли способ проверить, что родительское окно для iframe относится к определенному домену?

Вы можете добавить ключ к своему хэшу и отправить отметку времени с запросом, например:

 $key = "YOUR_SECRET_KEY"; $time = time(); $hash = hash_hmac('sha256', $time, $key); $url = "https://example.com/iframe?hash=$hash&time=$time"; 

С другой стороны, вы должны сначала проверить, находится ли метка времени в пределах (например, не старше пяти минут), а затем перефразировать ключ и предоставленную временную метку. Если вы получаете тот же хеш, запрос действителен.

Заметки:

  • не используйте MD5: алгоритм полностью сломан и больше не обеспечивает никакой безопасности (хотя он должен все еще быть в порядке при использовании с HMAC …)
  • вы должны использовать hash_compare для сравнения хэшей для предотвращения временных атак
  • мы используем HMAC для обеспечения целостности данных и аутентификации. См. https://crypto.stackexchange.com/questions/1070/why-is-hkx-not-a-secure-mac-construction, почему мы не должны просто конкатенировать время и ключ

Вы не должны использовать простой MD5, который; MD5 не предназначен для обеспечения подлинности сообщения. Вместо этого вы можете просто публиковать временную метку вместе с другой информацией (сообщением), закодированной base64, чтобы она не содержала символ «:». Затем вы можете вычислить код HMAC сообщения, например, с помощью

 $hmac = hash_hmac("md5", $message, $secret) $signed_message = $message . ":" . $hmac 

На другом конце вы можете проверить эту подпись, сначала разделив «:», получив $ message и $ hmac, тогда вы можете проверить подлинность с помощью

 $hmac == hash_hmac("md5", $message, $secret) 

Если коды совпадают, тогда проверьте, сохраняется ли метка времени в $message в пределах.

Будьте осторожны с использованием MD5 для хеширования – он криптографически сломан. Существует множество интернет-сайтов, которые помогают создавать конфликты. Скорее используйте что-то вроде SHA256 и всегда включайте длинную линию соления.

Если пользователю не нужно взаимодействовать с сайтом в iframe, вы можете подумать о том, чтобы очистить код сайта и вставить его прямо в свой код. Для этого есть несколько библиотек.

Как насчет использования чего-то вроде

 $hash = hash ( "sha256" , date("h") . 'myverylongsaltstring' ); 

Пока серверы имеют правильные временные метки и синхронизируются в течение часа, этот подход будет работать как ваш хэш времени ().

Кроме того, вы можете использовать что-то вроде TinyUrl, чтобы немного запутать ссылку. Что-то вроде строк http://www.technabled.com/2008/12/create-your-own-tinyurl-with-php-and.html

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

Вы должны использовать UUID или что-то подобное. Вероятность столкновения практически невозможна.