Генерация частных, уникальных, безопасных URL

Упс! это было простое исправление, которое я игнорировал.

я исправил этот код

list_filter = ['Report__branch']
date_hierarchy = 'Report__date'
13
задан Blaine 3 March 2009 в 07:46
поделиться

7 ответов

Обновление:

Для чего-то как единственный URL использования я пошел бы с GUID-esque appoach, который был предложен. Удостоверьтесь, что имели короткую продолжительность жизни на ссылке.

Для мгновенного входа в систему нет никакого действительно безопасного способа иметь единственный 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();
?>
9
ответ дан 1 December 2019 в 20:30
поделиться

Попробуйте 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, сгенерированные таким образом (безотносительно хеш-алгоритма), не будут 'безопасными', просто очень трудными предположить.

9
ответ дан 1 December 2019 в 20:30
поделиться

Просто генерируйте 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
ответ дан 1 December 2019 в 20:30
поделиться

Идентификатор должно быть невозможно предположить, GUID уникальны, но не являются этим трудно для предположения.

Вам нужен хороший генератор случайных чисел, каждая библиотека криптографии/шифрования имеет по крайней мере один, я не знаю PHP, таким образом, я не могу дать Вам имя функции.

Затем необходимо решить, какой длины случайное число будет, необходимо выбрать длину, столь большую, что любой предполагающий число получит неназначенное число - также:

  1. Оцените количество уникальных URL, которые необходимо будет генерировать, вычислить, сколько битов необходимо представить их всех и затем удвоить число битов (по крайней мере).

  2. Или, возьмите наибольшее число, которое примут Ваши пользователи

Теперь у Вас есть "безопасное" число, можно просто преобразовать его в десятичное число, шестнадцатеричное число или base64 и использование та строка.

3
ответ дан 1 December 2019 в 20:30
поделиться

Если Вы хотите удостовериться, что URL и уникален и может только использоваться ограниченное количество раз:

  • Сохраните маленькую базу данных с полями как: RandomKey, InternalURL, Counter, TimeStamp

  • Создайте случайное число из достаточно большого пула.
    Не Последовательные GUID должны быть достаточными

  • Сохраните его в своей базе данных как RandomKey, наряду с фактическим внутренним URL или кодом ресурса, необходимым Вашей системе для обработки того URL и метки времени.

  • Когда пользователь нажмет или введет URL, проверьте его по той базе данных: если TimeStamp слишком старо или Counter слишком высоко, примите соответствующие меры (например, если Вы хотите, чтобы этот URL был доступен на ограниченный срок или определенное количество раз).
    Иначе просто рассматривайте запрос с помощью InternalURL и передайте его результат обратно пользователю.

  • Когда URL использовался или достиг своего максимального счетчика использования, затем просто удалите его из базы данных, таким образом, он не может использоваться дальше.

Здорово, чтобы дать Вам одноразовые URL, которые практически невозможно предположить.

Конечно, необходимо также реализовать некоторые проверки безопасности для ограничения уровня, на котором люди могут попытаться получить доступ к недопустимому URL.

2
ответ дан 1 December 2019 в 20:30
поделиться

Я избежал бы этого для:

1) Момент входит в систему ярлык/значок для пользователей

потому что эти URL могут кэшироваться/зарегистрированы прокси, блоги, кэш браузера, закладки, электронные письма и т.д.

2
ответ дан 1 December 2019 в 20:30
поделиться

Обрезать дополнительные фигурные скобки

$guid = strtolower (обрезка (com_create_guid (), "{}")); (PHP 5 или позже)

1
ответ дан 1 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: