"PHP" / Говнокод #10986 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
<?php

define(STATIC_SALT, "herz_salt");

function generateRandChar()
{
  $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
  
  $numChars = strlen($chars);
  
  $string = '';
  
  for ($i = 0; $i < rand(1, 7); $i++) 
  {
      $string .= substr($chars, rand(1, $numChars) - 1, 1);
  }
  
  return $string;
}

$time = microtime(true) / 10000;

$str = $time - floor($time);

$str = (string)$str;

$str = preg_replace('/0./', '', $str);

$deleteNum = strlen($str);

if($deleteNum  <= 5)
{
    $str = substr($str, rand(0, 4));
}
elseif($deleteNum > 5 && $deleteNum  <= 10)
{
    $str = substr($str, rand(5, 9));
}
else $str = substr($str, rand(7, 9));

if(strlen($str) == 0)
{
    $str = rand(0, 15000);
}

sleep(5);

$str = sha1(md5($str . STATIC_SALT . microtime(true))) . generateRandChar();

echo $str;

?>

паранойя в действии :)

Запостил: Archont12 Archont12, (Updated )

Комментарии (36) RSS

  • $str . STATIC_SALT . microtime(true))) . generateRandChar()

    а я уж было подумал, что хацкель
    Ответить
    • > паранойя в действии 🙂
      Это не паранойя, а непонимание основ криптографии.

      > sleep(5)
      Автору нет прощения.

      Я вот не пойму, что пытался выразить автор сего творения. Генерацию случайного идентификатора? Тогда зачем все это. Все эти танцы с обрезаниями строк и хешем на хеше только делают результат МЕНЕЕ случайным...
      Ответить
      • UPD: Этот код намного хуже, чем sha1(rand() . STATIC_SALT . microtime(false))
        Ответить
      • >sleep(5)
        это просто имитация крутого алгоритма, который работает аж целых пять секунд

        ЕМНИП, rand() генерирует последовательность {x_i = a * x_{i-1} + b \bmod m}, что не очень секурно

        А вообще что это? Попытка хэширования с рандомной солью и защитой от терморектального криптоанализа?
        Ответить
        • > это просто имитация крутого алгоритма, который работает аж целых пять секунд
          Вот лучше бы он sha погонял раз на 100 🙂 Все веселее.

          > rand() генерирует последовательность {x_i = a * x_{i-1} + b \bmod m}
          Угу. Поэтому что один rand(), что 100500 - криптостойкость от этого не повысится.

          > Попытка хэширования с рандомной солью
          Ну тут нет входной строки. Так что это просто рандомный идентификатор. Видимо для генерации ссылок на загрузку файла...
          Ответить
          • Совсем непонятны все эти загоны для одноразовой ссылочки. Неисповедимы пути пхпшника.
            Ответить
            • Самое печальное, что все эти загоны и по криптостойкости, и по скорости, и по наглядности хуже банальной строчки sha1(rand() . STATIC_SALT . microtime(false)).

              Путь настоящего похапшника - экономить на спикавычках (одинарные кавычки работают на 10 наносекунд быстрее!), не использовать проверенных алгоритмов (понаписали всякой непонятной херни, чем разбираться - лучше напишу свой!), не читать манов (зачем? все и так понятно!). Вот так :[

              P.S. Archont12, поясните пожалуйста, для чего автор хотел применить (или, возможно, применил) данный код?
              Ответить
              • ))))) Если бы я знал для чего конкретно. Сотрудник в своем проекте генерирует для чего-то уникальный ключ, по его словам, могу предположить что для одноразовых ссылок на видео.
                Решил похвастаться алгоритмом. )))
                Ответить
            • пхпшник прожит не затем, чтобы работало, быстро и надежно, а затем, чтобы потешить чсв
              Ответить
      • На самом деле для авторизации так и надо. 5 секунд подождать - если ползьователь зарегился с паролем "1234", то он такому программисту потом спасибо скажет.

        Примерно похожим (но не таким, конечно) способом работает генерация паролей во фряхе - вызывает 50 раз кажется MD5 с продуктом от прошлого MD5. Но вообще не важно какой именно алгоритм, главное чтобы не генерировать много похожих хешей, а тут вроде такого не случится.

        Тут даже проблема немного в другом, хеширующие функции типа MD5 / SHA работают очень быстро, что делает перебор / подбор ключей проще. Хотя, конечно, просто вызвать надцать раз тот же MD5 / SHA было бы меньше кода 🙂
        Ответить
        • > На самом деле для авторизации так и надо. 5 секунд подождать
          Но это же не авторизация? Здесь нет входной строки... А за генерацию ссылки на файл в течении 5 секунд мне всегда хотелось убивать...

          Проблема в том, что код, который над 48й строкой, уменьшает количество возможных хешей. В $str возможны только пятизначные числа - т.е. около 99999 вариантов с хрен-пойми-каким распределением - в то же время обычный rand() на месте $str дал бы гораздо больше вариантов. Поэтому код выше 48й строки не имеет никакого смысла.
          Ответить
        • > Но вообще не важно какой именно алгоритм
          Для засолки и проверки паролей - важно. Попадался велосипедный "хеш", к которому можно было подбирать исходную строку с помощью листа бумаги, ручки и калькулятора 😉

          А для генерации ссылки на загрузку видеофайла (http://govnokod.ru/10986#comment142672), конечно, пофиг. Тут бы uniqid() хватило.
          Ответить
          • Это ссылка на файл для скачивания? Тогда вообще ничего не понятно.
            По поводу кода выше / ниже: я сначала представил себе, что кроме пароля генерируется "шум", а потом там, где проверяется, он отрезается. Но если это файл то вообще непонятно зачем все это.
            Ответить
          • Вот что да хорошо, так это:

            [quote]
            By default, microtime() returns a string in the form "msec sec", where sec is the current time measured in the number of seconds since the Unix epoch (0:00:00 January 1, 1970 GMT), and msec is the number of microseconds that have elapsed since sec expressed in seconds.[/quote]
            Время которое измеряется в числах секунд - кажется причины проблемы с датами начинают становиться более очевидными.
            Ответить
            • Компьютерное время исчисляется в количестве секунд (c UNIX epoch или какой-то другой точки) с незапамятных времён. А вот что строку надо парсить, чтобы получить компоненты - это пять.
              Ответить
              • Измеряется в секундах, прошу заметить, а не в количестве секунд. Это количество измеряется в секундах. Кроме того, еще и красиво получилось в документации:

                "и msec - это число микросекунд прошедших с sec измеряные в секундах"

                Кого они меряли в секундах? Микросекунды?
                Ответить
                • всё там понятно написано.
                  sec expressed in seconds
                  sec измеряется в секундах с UNIX epoch
                  msec is the number of microseconds that have elapsed
                  msec измеряется в миллисекундах, сколько мс прошло с последней секунды.
                  |                     |
                  |-------->|-----------|
                  |       msec          |
                  sec                sec + 1
                  Ответить
                  • Если произвольно редактировать текст справки - то да, но в оригинальной справке предложение не заканчивается на elapsed, и написано там именно следующее:

                    "И msec - число микросекунд которые прошли с sec выраженн[ые/ых] в секундах."

                    Это так называемая garden path конструкция, или еще известная как dangling else - т.е. когда обстояетльство в предложении не возможно однозначно связать с одним из членов предложения (не понятно что выражено в секундах: если sec - то зачем повторять то что было только что сказано в этом же предложении, если msec - то как это они микросекунды в секундах меряют?)

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

                    Отдельным пунктом можно добавить, что GMT не является стандартом для времени и его использование не рекомендовано, чтобы избежать разночтений, нужно пользоваться UTC, который в принципе то же самое, что GMT, но однозначно определен.
                    Ответить
                  • Более того, изза неграмотно составленной фразы возникает когнитивный диссонанс, и когда человек начинает искать истину в документации, то появляются еще варианты, вполне опять же, уместные, например:
                    "И msec - число прошедших (куда?) микросекунд, потому что sec измеряется в секундах".
                    Последний вариант был бы наиболее предпочтителен для читателя не имееющего привычки читать технические тексты (написаные, как правило людьми страдающими крайней формой дислексии).
                    Ответить
                    • Не хочу ничего сказать против, но roman-kashitsyn совершенно прав.
                      Функция возвращает строку из компонентов текущего времени от эпоча, равному сумме секунд и микросекунд, где микросекунды принимают значение от нуля до, вероятно, 0.999999990.99999900; именно про это и написано в справке, никаких вторых толкований быть не может. Никаких микросекунд в секундах там нет.
                      Ответить
                      • Это вам кажется. Не, серьезно, вам просто очень хочется верить, что там все так, как вы думаете, но на самом деле...

                        Программистом я был меньшую часть своей жизни, а большую - проработал газетчиком. Так вот, говорю я это к тому, что есть разные ошибки. Есть такие, которые очень любят искать в интернетах - типа тся и ться. Есть такие - которые меньше исчут в интернетах - типа запятых (т.как никто, если по-честному, то не знает где их ставить, даже в родственных языках правила различаются). И есть ошибки в построении предложения, это когда человек плохо понимает язык, на котором разгорваривает и, как следствие, выражается штампами. ВНИМАНИЕ, так разговаривают и пишут подавляющее большинство людей. Напирмер, для англоязычных нормально сказать ATM machine - т.е. когда толком не помнишь что именно стоит за аббревиатурой, то можно сказать глупость.)
                        Люди, которые осознанно составляют предложения - это люди которых этому научили. Так вот справка написана плохо в том смысле, что не срастаются части предложения во что-то, что можно назвать нормальным английским предложением. Более того, скорее всего писалась каким-нибудь Амиром Авихаем из Кирьят Мордехая или Петах Тиквы, и от желания подражать формализмам английского языка, который на экзамене Амира он сдал на троечку у него получилось то, что получилось.
                        Ответить
                        • Я не буду лезть в дебри справки, ингриш и всё такое. Скажу только то, что лично я из справки понял всё, как оно работает. Остальное - для эстетов.
                          Ответить
                  • Тяжеловато, хотя да, все лучше, чем строка через пробел.

                    Ну спасибо и на том, что вторым вариантом можно получить это время как double...
                    Ответить
          • > Попадался велосипедный "хеш", к которому можно было подбирать исходную строку с помощью листа бумаги, ручки и калькулятора 😉

            Называется CRC?
            Ответить
            • Не, все хуже 🙂 Самопальный говнохэш с ксорами и сдвигами.

              А CRC... ну да, тоже элементарно подбирается.
              Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8