В приложении 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";
С другой стороны, вы должны сначала проверить, находится ли метка времени в пределах (например, не старше пяти минут), а затем перефразировать ключ и предоставленную временную метку. Если вы получаете тот же хеш, запрос действителен.
Заметки:
hash_compare
для сравнения хэшей для предотвращения временных атак Вы не должны использовать простой 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 или что-то подобное. Вероятность столкновения практически невозможна.