Нужна меньшая альтернатива GUID для идентификатора DB, но все еще уникальный и случайный для URL

Объединив то, что сказал Владимир Прудников и Томас Хансен:

  • Измените свой серверный код, чтобы определить, является ли это XHR. Если это так, установите ответный код перенаправления на 278. В django:
   if request.is_ajax():
      response.status_code = 278

Это делает браузер успешным ответом на ответ.

  • В своем JS убедитесь, что представление формы через Ajax, проверьте код ответа и при необходимости перенаправите:
$('#my-form').submit(function(event){ 

  event.preventDefault();   
  var options = {
    url: $(this).attr('action'),
    type: 'POST',
    complete: function(response, textStatus) {    
      if (response.status == 278) { 
        window.location = response.getResponseHeader('Location')
      }
      else { ... your code here ... } 
    },
    data: $(this).serialize(),   
  };   
  $.ajax(options); 
});
33
задан uriDium 9 February 2009 в 20:25
поделиться

10 ответов

[В ответ на редактирование]
необходимо рассмотреть строки запроса как "злой вход". Необходимо программно проверить, что аутентифицируемому пользователю разрешают просмотреть требуемый объект.

if( !item456.BelongsTo(user123) )
{
  // Either show them one of their items or a show an error message.
}
10
ответ дан 27 November 2019 в 16:46
поделиться

у Raymond Chen есть хорошая статья о том, почему Вы не должны использовать "половину гуида" и предлагаете подходящее решение генерации Вашего собственного "не совсем гуид, но достаточно хорошее" значение типа здесь:

GUID глобально уникальны, но подстроки GUID не

, Его стратегия (без определенного implementiation) была на основе:

  • Четыре бита для кодирования компьютерного числа,
  • 56 битов для метки времени, и
  • четыре бита как uniquifier.

Мы можем сократить количество битов для создания компьютера уникальным, так как количество компьютеров в кластере ограничено, и мы можем сократить количество битов в метке времени путем предположения что программа won’t находиться в эксплуатации 200 лет с этого времени.

можно сойти с рук четырехразрядный uniquifier путем предположения, что часы won’t дрейф, который больше чем час из скоса (говорит) и что часы won’t сбросили больше чем шестнадцать раз в час.

16
ответ дан 27 November 2019 в 16:46
поделиться

ОБНОВЛЕНИЕ (4 февраля 2017):
Walter Stabosz обнаружил ошибку в исходном коде. После расследования были дальнейшие обнаруженные ошибки, однако, обширное тестирование и переделка кода один, исходный автор ( CraigTP) теперь устранил все эти проблемы. Я обновил код здесь с корректной рабочей версией, и Вы можете также загружать решение для Visual Studio 2015 года здесь , который содержит "shortcode" код поколения и пакет довольно комплексного испытания для доказательства правильности.

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

Пример

Console.WriteLine($"1371 as a shortcode is: {ShortCodes.LongToShortCode(1371)}");
Console.WriteLine($"12345 as a shortcode is: {ShortCodes.LongToShortCode(12345)}");
Console.WriteLine($"7422822196733609484 as a shortcode is: {ShortCodes.LongToShortCode(7422822196733609484)}");

Console.WriteLine($"abc as a long is: {ShortCodes.ShortCodeToLong("abc")}");
Console.WriteLine($"ir6 as a long is: {ShortCodes.ShortCodeToLong("ir6")}");
Console.WriteLine($"atnhb4evqqcyx as a long is: {ShortCodes.ShortCodeToLong("atnhb4evqqcyx")}");    

// PLh7lX5fsEKqLgMrI9zCIA   
Console.WriteLine(GuidToShortGuid( Guid.Parse("957bb83c-5f7e-42b0-aa2e-032b23dcc220") ) );      

Код

следующий код показывает простой класс, который изменит длинное на "код" (и назад снова!):

public static class ShortCodes
{
    // You may change the "shortcode_Keyspace" variable to contain as many or as few characters as you
    // please.  The more characters that are included in the "shortcode_Keyspace" constant, the shorter
    // the codes you can produce for a given long.
    private static string shortcodeKeyspace = "abcdefghijklmnopqrstuvwxyz0123456789";

    public static string LongToShortCode(long number)
    {
        // Guard clause.  If passed 0 as input
        // we always return empty string.
        if (number == 0)
        {
            return string.Empty;
        }

        var keyspaceLength = shortcodeKeyspace.Length;
        var shortcodeResult = "";
        var numberToEncode = number;
        var i = 0;
        do
        {
            i++;
            var characterValue = numberToEncode % keyspaceLength == 0 ? keyspaceLength : numberToEncode % keyspaceLength;
            var indexer = (int) characterValue - 1;
            shortcodeResult = shortcodeKeyspace[indexer] + shortcodeResult;
            numberToEncode = ((numberToEncode - characterValue) / keyspaceLength);
        }
        while (numberToEncode != 0);
        return shortcodeResult;
    }

    public static long ShortCodeToLong(string shortcode)
    {
        var keyspaceLength = shortcodeKeyspace.Length;
        long shortcodeResult = 0;
        var shortcodeLength = shortcode.Length;
        var codeToDecode = shortcode;
        foreach (var character in codeToDecode)
        {
            shortcodeLength--;
            var codeChar = character;
            var codeCharIndex = shortcodeKeyspace.IndexOf(codeChar);
            if (codeCharIndex < 0)
            {
                // The character is not part of the keyspace and so entire shortcode is invalid.
                return 0;
            }
            try
            {
                checked
                {
                    shortcodeResult += (codeCharIndex + 1) * (long) (Math.Pow(keyspaceLength, shortcodeLength));
                }
            }
            catch(OverflowException)
            {
                // We've overflowed the maximum size for a long (possibly the shortcode is invalid or too long).
                return 0;
            }
        }
        return shortcodeResult;
    }
}

}

Это - по существу Ваш собственный baseX нумерация системы (где эти X являются количеством уникальных символов в shortCode_Keyspace константе.

Для создания вещей непредикабельными запустите внутреннюю нумерацию постепенного увеличения в чем-то другом, чем 1 или 0 (т.е. запустите в 184 723), и также измените порядок символов в shortCode_Keyspace константе (т.е. используйте буквы A-Z и номера 0-9, но scamble их порядок в постоянной строке. Это поможет сделать каждый код несколько непредсказуемым.

при использовании этого для "защищения" чего-нибудь, это - все еще безопасность с помощью мрака, и если данный пользователь может наблюдать достаточно этих сгенерированных кодов, они могут предсказать соответствующие нормы для даваемого долго. "Безопасность" (если можно назвать его, что) этого - то, что shortCode_Keyspace константа скремблирована и остается секретной.

РЕДАКТИРОВАНИЕ: Если Вы просто захотите генерировать GUID и преобразовать его к чему-то, что все еще уникально, но содержит несколько меньше символов, то эта небольшая функция добьется цели:

public static string GuidToShortGuid(Guid gooid)
{
    string encoded = Convert.ToBase64String(gooid.ToByteArray());
    encoded = encoded.Replace("/", "_").Replace("+", "-");
    return encoded.Substring(0, 22);
}
15
ответ дан 27 November 2019 в 16:46
поделиться

Если Вы не хотите, чтобы другие пользователи видели людей информация, почему Вы не защищаете страницу, которая Вы используете идентификатор?

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

14
ответ дан 27 November 2019 в 16:46
поделиться

Вы могли случайным образом генерировать число. Проверьте, что это число уже не находится в DB, и используйте его. Если Вы хотите, чтобы это появилось как случайная строка, Вы могли бы просто преобразовать его в шестнадцатеричный, таким образом, Вы получаете A-F там точно так же, как в Вашем примере.

3
ответ дан 27 November 2019 в 16:46
поделиться

GUID составляет 128 битов. Если Вы берете эти биты, и don’t используют набор символов со всего 16 символами для представления их (16=2^4 и 128/4 = 32 chacters), но набор символов с, let’s для высказывания, 64 символа (как Основа 64), Вы закончили бы только в 22 символах (64=2^6 и 128/6 = 21.333, таким образом, 22 символа).

2
ответ дан 27 November 2019 в 16:46
поделиться

Возьмите свой автоинкрементный идентификатор и HMAC-SHA1 это с секретом, известным только Вам. Это генерирует случайно выглядящие 160 битов, которые скрывают реальный возрастающий идентификатор. Затем возьмите префикс длины, которая делает коллизии достаточно вряд ли для Вашего приложения---, говорят, что 64 бита, которые можно закодировать в 8 символах. Используйте это в качестве своей строки.

HMAC гарантирует, что никто не может отобразиться от битов, показанных назад базовому числу. Путем хеширования автоинкрементного идентификатора можно быть вполне уверены, что это будет уникально. Таким образом, Ваш риск для коллизий прибывает из вероятности 64-разрядной частичной коллизии в SHA1. С этим методом можно предопределить, если у Вас будут какие-либо коллизии путем предварительной генерации всех случайных строк, что этот метод, которые генерируют (например, до количества строк Вы ожидаете), и проверка.

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

2
ответ дан 27 November 2019 в 16:46
поделиться

То, что Вы могли сделать, является чем-то, что я делаю, когда я хочу точно, что Вы желаете.

  1. Создают Ваш GUID.

  2. Добираются, удаляют тире и получают подстроку того, сколько времени Вы хотите свою идентификационную

  3. Проверку дб для того идентификатора, если это существует, goto шаг 1.

  4. Вставляет запись.

Это - самый простой способ обеспечить, чтобы он был затенен и уникален.

0
ответ дан 27 November 2019 в 16:46
поделиться

У меня только что была идея, и я вижу, что Greg также указал на это. Мне сохранили пользователя на сессии с идентификатором пользователя. Когда я создам свой запрос, я присоединюсь на таблице Users к тому идентификатору пользователя, если набор результатов будет пуст затем, мы знаем, что он взламывал URL, и я могу перенаправить к ошибочной странице.

0
ответ дан 27 November 2019 в 16:46
поделиться

Сколько времени является слишком длинным? Вы могли преобразовать GUID для Базирования 64, который заканчивает тем, что делал его вполне немного короче.

-1
ответ дан 27 November 2019 в 16:46
поделиться
Другие вопросы по тегам:

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