У меня есть веб-сайт PHP, который действует как веб-прокси / анонимайзер, и я настроил его, чтобы каждая посещенная страница кэшировалась на моем сервере в течение ограниченного времени. Для большей безопасности я хотел бы закодировать URL-адреса в набор шестнадцатеричных символов, но он должен быть достаточно уникальным, чтобы два URL-адреса никогда не конфликтовали друг с другом ; Имя файла кэшированной страницы будет отражать закодированный URL-адрес, поэтому я не могу допустить их перезапись при посещении другой страницы.

Между тем я использовал это:

$file = str_shuffle(preg_replace("/[^a-zA-Z0-9\s]/", "", urlencode($url))) .".html";

... Но проблема здесь в том, что он всегда случайный и не гарантирует полной уникальности. Я хотел бы сделать так, чтобы пользователи могли добавлять свои URL-адреса в закладки (и повторно посещать их в течение определенного периода времени, без необходимости повторно переходить на страницу). Как я могу сгенерировать такую ​​строку?

0
RectangleEquals 12 Дек 2012 в 14:02
2 разных URL-адреса не будут конфликтовать, даже если вы просто выполните urlencode в одиночку. Как вы думаете, почему они будут конфликтовать?
 – 
Esailija
12 Дек 2012 в 14:04
UUID? /dev/urandom + base64_encode?
 – 
Charles
12 Дек 2012 в 14:05
Что делать, если пользователи посещают динамическую страницу, например сайты знакомств, где сообщения отображаются на post.php, а не разделены для каждого пользователя?
 – 
The87Boy
12 Дек 2012 в 14:05
Да, но urlencode сам по себе представляет собой высокий риск для безопасности, который легко изменить с помощью urldecode.
 – 
RectangleEquals
12 Дек 2012 в 14:12
Спасибо, это намного ближе к тому, что я собираюсь сделать. Но опять же, base64_decode представляет здесь угрозу. Мне нужен алгоритм, который не сможет так легко победить злоумышленник.
 – 
RectangleEquals
12 Дек 2012 в 14:12

1 ответ

Лучший ответ

Если вам нужна «безопасная», например необратимая , уникальная «кодировка» URL-адреса, вот что хеши для:

$hash = sha1('http://...');

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

Если вы говорите о кодировке (переходе от одной формы к другой) или шифровании (переходе в другую форму с помощью секретного ключа ), тогда вы говорите об обратимых алгоритмах, и в этом случае результат уникален по определению. Кодирование строки не будет "безопасным", поскольку в ней нет секрета. Шифрование строки настолько безопасно, насколько вы храните секрет.

Итак, у вас есть три варианта:

  1. кодирование (например, url_encode, base64_encode), которое не является безопасным и обратимым
  2. шифрование (например, AES), которое использует секрет, является безопасным и обратимым
  3. хеширование (например, SHA1), которое необратимо и, следовательно, безопасно

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

2
deceze 12 Дек 2012 в 14:17
Отлично, спасибо! Будет ли md5('http://...') иметь такой же "необратимый" эффект? А что безопаснее?
 – 
RectangleEquals
12 Дек 2012 в 14:18
Да, MD5 - это хеш, как описано выше. К настоящему времени он несколько устарел и имеет несколько более высокие вероятности получения неуникальных значений и / или другие вероятности, которые позволяют вернуться к исходному значению. Вероятно, этого достаточно для ваших целей, но в наши дни более рекомендуются SHA1 или SHA256 (или даже 512). Хотя хеши длиннее, это зависит от ваших приоритетов.
 – 
deceze
12 Дек 2012 в 14:20
Что ж, поскольку мой веб-сайт не принадлежит правительству ЦРУ, полагаю, я мог бы согласиться на MD5, лол. И не должно быть слишком сложно перенести код для использования sha1 в будущем, если я найду в этом необходимость. Спасибо!
 – 
RectangleEquals
12 Дек 2012 в 14:26