Создание частных, уникальных, безопасных URL-адресов
Я бы хотел создать безопасный тип доступа с одним щелчком мыши, аналогичный приведенным ниже примерам. Я буду использовать PHP, но это не имеет значения, поскольку я просто хочу понять базовую концепцию. В некоторых ответах предлагается использовать GUID, но я не думаю, что это даст мне абсолютно уникальный, безопасный URL, как показано ниже.
# Google Calendar
3qq6jlu04ptlhmb9fencsu5t2k
# Private
3qq6jlu04ptlhmb9fencsu5t2k
# Private 'token'
163a0afe7fkb1ba2acd04c11ef0eefe8
# LogMeIn
# 1024 bit - 128 Character URL
72oxuj0fzefqo3fu04xjtvmd0adj2948rfh7g5by4forkwcy7t651z7hcb6kjjgqkxmvmfqpyrcfy15z1fto8ewcxstjc6avicag7d5qnoimsm19kb9kgi9i7v6z01d5
Я склоняюсь к этому 128-значному, 1024-битовому стилю, поскольку он кажется очень безопасным. Наверное, я могу сделать четыре хэша MD5 и объединить их, но действительно ли это эффективно?
У меня есть два конкретных намерения для такого URL, но я уверен, что есть другие, которые могут найти это полезным.
1) Мгновенный вход в ярлык/значок для пользователей
2) Одноразовый URL (ссылки для восстановления пароля)
Ответы
Ответ 1
Update:
Что-то вроде одного URL-адреса использования, я бы пошел с приложением GUID-esque, которое было предложено. Убедитесь, что у вас короткая продолжительность жизни по ссылке.
Для мгновенного входа в систему нет надежного способа иметь единственный URL-адрес.
Да, вы можете создать URL-адрес, который будет почти невозможно догадаться, но это не дает вам супер-безопасности. Если вы хотите запомнить пользователей, почему бы не использовать зашифрованный файл cookie для проверки подлинности?
В примере, который вы даете, Google Calendar не регистрирует вас через URL-адрес, вы должны пройти аутентификацию сначала, прежде чем URL-адрес означает что-либо.
например. нажатие на календарь Google из моего gmail дает мне:
https://www.google.com/calendar/render?tab=mc&gsessionid=-LTeHrnKoeAbDcVaN68NHA
Это не поможет вам получить доступ к моей учетной записи, если вы сначала не аутентифицировались как я.
Старый пост:
Вы можете создать GUID в PHP, используя com_create _guid и использовать его.
В linux я думаю, вы можете использовать uuid_create, или этот код из здесь:
<?php
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
echo guid();
?>
Ответ 2
Попробуйте uniqid - и, возможно, в сочетании с хешем md5, как указано в примерах:
// no prefix
// works only in PHP 5 and later versions
$token = md5(uniqid());
// better, difficult to guess
$better_token = md5(uniqid(rand(), true));
Однако я должен отметить, что никакие URL-адреса, созданные таким образом (независимо от алгоритма хеширования), не будут "безопасными", просто очень трудно угадать.
Ответ 3
Просто сгенерируйте GUID. Это важно, хотя это не старый GUID старого стиля, хотя.
Однако, похоже, что php не имеет собственной функции генерации GUID. Функция com_create_guid, предложенная в другом ответе, доступна только в php при работе в Windows.
Существует альтернатива для com_create_guid для не-Windows на странице руководства:
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
Но я должен признать, что я не хотел бы использовать его для чего-либо важного, если бы в нем не было очевидной проблемы, что мой некриптографически обученный ум не заметил.
Ответ 4
Идентификатор должен быть невозможно догадаться, GUID уникальны, но не так сложно догадаться.
Вам нужен хороший генератор случайных чисел, каждая библиотека криптографии/шифрования имеет хотя бы один, я не знаю PHP, поэтому я не могу дать вам имя функции.
Затем вам нужно решить, как долго будет ваше случайное число, вы должны выбрать такую длинную длину, что любой, угадающий номер, получит неназначенное число: либо
-
Оцените количество уникальных URL-адресов, которые вам нужно будет генерировать, подсчитайте, сколько бит вам нужно представлять для всех, а затем удвоить количество бит (по крайней мере).
-
Или, возьмите наибольшее число, которое ваши пользователи будут принимать
Теперь у вас есть "безопасный" номер, который вы можете просто преобразовать в десятичный, hex или base64 и использовать эту строку.
Ответ 5
Я бы избегал этого для:
1) Мгновенный вход в ярлык/значок для пользователей
потому что эти URL-адреса могут кэшироваться/регистрироваться в прокси-серверах, блогах, кеше браузера, закладках, электронной почте и т.д.
Ответ 6
Чтобы обрезать дополнительные фигурные скобки
$guid = strtolower (обрезка (com_create_guid(), "{}" )); (PHP 5 или новее)
Ответ 7
Если вы хотите убедиться, что URL-адрес уникален и может использоваться только ограниченное количество раз:
-
Храните небольшую базу данных с полями: RandomKey
, InternalURL
, Counter
, TimeStamp
-
Создайте случайное число из достаточно большого пула.
Необязательные GUID должны быть достаточными
-
Сохраните его в своей базе данных как RandomKey
, а также фактический внутренний URL-адрес или код ресурса, необходимые вашей системе для обработки этого URL-адреса и отметки времени.
-
Когда пользователь нажимает или вводит URL-адрес, проверяйте его против этой базы данных: если значение TimeStamp
слишком велико или Counter
слишком велико, выполните соответствующие действия (например, если вы хотите, чтобы этот URL-адрес был быть доступным в течение ограниченного времени или определенного количества раз).
В противном случае просто обработайте запрос с помощью InternalURL
и отправьте его результат пользователю.
-
Когда URL-адрес был использован или достиг максимального счетчика использования, просто удалите его из базы данных, чтобы он больше не использовался.
Это здорово дать вам разовые URL-адреса, которые практически невозможно угадать.
Конечно, вы также должны выполнить некоторые проверки безопасности, чтобы ограничить скорость, с которой люди могут пытаться получить доступ к недопустимому URL.