php - генерирует нелинейные URL - PullRequest
0 голосов
/ 06 декабря 2009

Обновление:

Хорошо ... Я прочитал много решений ... Большое спасибо всем. я думаю я будет держать это простым и избежать шифрование и просто полагаться на два поля соответствие в базе данных. Я могу держать идентификатор как есть (последовательный), но добавить например, отметка времени (с: удалены). Тогда я могу поставить как через генератор URL-адреса в стиле YouTube ... оставив меня с действительно коротким, уникальным и не легко угадать URL. * например 1006 *

до появления URL-адреса YouTube blah.com?id=10345&s=134025

после blah.com?id=H2s&s=tL2s

В любом случае я регистрирую уникальные представления для каждого идентификатора ... поэтому я буду записывать неудачные тоже и если пользователь нажимает 10 не совпадающих URL через час, тогда я могу заблокировать его IP (я знаю, прокси уклонится это ... но это делает его более сложно).

Что вы думаете?

Это может показаться странным вопросом ... то, чего я хочу добиться, - это способ создания идентификатора, который будет использоваться в URL, который невозможно угадать или рассчитать. Я имею в виду, что это не id = 1, id = 2 ...

Я смотрел сценарий в стиле YouTube здесь . У которого есть опция заполнения, но заполнение так очевидно с URL, такими как wTTTa и b666o. Я рассмотрел MD5 в качестве идентификатора ... но это вряд ли надежно и делает для довольно длинных URL.

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

Ответы [ 9 ]

1 голос
/ 06 декабря 2009

Я бы, вероятно, решил эту проблему, получив временную метку, затем MD5 с отметкой, а затем запустив substr (), чтобы получить последние 4-8 символов (в зависимости от ваших предпочтений). Сравните сгенерированный идентификатор с уже созданными (с простой таблицей MySQL), чтобы гарантировать уникальность идентификатора.

Вы также можете добавить к временной метке идентификатор или MD5 идентификатора, чтобы еще больше повысить его уникальность.

1 голос
/ 06 декабря 2009

Что делать, если вы md5 идентификатор и случайная строка

$id = md5( $id . uniqid( mt_rand(), true ) );

Это должно сделать его неуязвимым.

Затем проверьте базу данных, чтобы увидеть, существует ли этот идентификатор.

$db = mysql_connect('localhost', 'username', 'password');
mysql_select_db( 'table' );
$id = 223;

do {

    $unique_id = substr( md5( $id . uniqid( mt_rand(), true ) ), 0, 8 );
    $q = mysql_query( sprintf( "select id from ids where id='%s'", intval($unique_id) ) );
    $c = mysql_num_rows( $q );

} while ( $c > 0 );

echo $unique_id;

Это единственный способ гарантировать уникальность при ограничении количества символов в идентификаторе

0 голосов
/ 06 декабря 2009

Вам необходимо сгенерировать «неузнаваемый ключ». Если вы сгенерируете 20 (или даже 12 или около того) символов с символами base64, у вас все будет хорошо для большинства систем.

Проработайте основную математику, чтобы убедиться, что вам удобно с ней. Учитывая 64 ^ 20 возможных ключей, сколько времени потребуется хакеру, чтобы наткнуться на действительный? Ну, сколько они могут угадать в секунду, и сколько у вас будет? Многие сайты используют эту технику для предоставления URL.

Несколько советов по их использованию:

  • Я бы подумал о том, можете ли вы каким-то образом сделать это "временным". Может быть, они должны существовать только в течение месяца или нескольких месяцев, а затем должны быть обновлены создателем?
  • Я бы порекомендовал вам сохранить ваши обычные идентификаторы в вашей базе данных и добавить это в качестве второго ключа, к которому вы можете получить доступ к записям. Внутренне используйте последовательные идентификаторы, так как это будет удобно, и используйте только неосуществимые ключи при генерации и обработке URL.

Вы МОЖЕТЕ использовать что-то вроде ссылок выше:

http://www.oreillynet.com/pub/a/php/2002/12/05/one_time_URLs.html

(В Ruby и Java для этого есть библиотеки. Я не уверен насчет PHP. См. http://api.rubyonrails.org/classes/ActiveSupport/SecureRandom.html.)

0 голосов
/ 06 декабря 2009

Посмотрите на create_guid () из SugarCRM.

Это действительно создает уникальные идентификаторы. Это в include / utils.php (круглая строка 1300)

0 голосов
/ 06 декабря 2009

Я не парень по PHP, но, похоже, вам нужен случайно сгенерированный GUID.

Это может помочь , но я не слишком уверен в сложности вывода.

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

0 голосов
/ 06 декабря 2009

как насчет использования слагов ?, мы всегда заменяем идентификаторы на слагов, поэтому у нас есть более приятные URL-адреса как для ваших пользователей, так и для поисковых систем, а также мы не выдаем ключи БД.

slugs - это нормализованные и уникальные строки, подобные той, что содержится в этом же вопросе: "php-generate-non-linear-urls"

0 голосов
/ 06 декабря 2009

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

0 голосов
/ 06 декабря 2009

Просто используйте random () из этого класса,

https://gallery.svn.sourceforge.net/svnroot/gallery/trunk/eval/gx/kohana/kohana/helpers/text.php

Генерирует случайные строки в другом формате. Вы можете просто использовать это как идентификатор. Я использую это в своем URL,

  random('distinct', 10)
0 голосов
/ 06 декабря 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...