1. PHP / Говнокод #10986

    +56

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 16 Июня 2012

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

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

      а я уж было подумал, что хацкель
      Ответить
    • > sha1(md5(
      я многое в коде прощу, но вот это зря, оч зря
      Ответить
      • > паранойя в действии :)
        Это не паранойя, а непонимание основ криптографии.

        > 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, поясните пожалуйста, для чего автор хотел применить (или, возможно, применил) данный код?
                Ответить
                • ))))) Если бы я знал для чего конкретно. Сотрудник в своем проекте генерирует для чего-то уникальный ключ, по его словам, могу предположить что для одноразовых ссылок на видео.
                  Решил похвастаться алгоритмом. )))
                  Ответить
              • пхпшник прожит не затем, чтобы работало, быстро и надежно, а затем, чтобы потешить чсв
                Ответить
            • Дык ему просто UUID нужен был? В жабе это
              UUID.randomUUID().toString()
              Ответить
        • На самом деле для авторизации так и надо. 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 измеряется в секундах".
                      Последний вариант был бы наиболее предпочтителен для читателя не имееющего привычки читать технические тексты (написаные, как правило людьми страдающими крайней формой дислексии).
                      Ответить
                      • показать все, что скрытоОтсосу хуй у кавказца [email protected]
                        Ответить
                      • Не хочу ничего сказать против, но roman-kashitsyn совершенно прав.
                        Функция возвращает строку из компонентов текущего времени от эпоча, равному сумме секунд и микросекунд, где микросекунды принимают значение от нуля до, вероятно, 0.999999990.99999900; именно про это и написано в справке, никаких вторых толкований быть не может. Никаких микросекунд в секундах там нет.
                        Ответить
                        • Это вам кажется. Не, серьезно, вам просто очень хочется верить, что там все так, как вы думаете, но на самом деле...

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

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

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

                А CRC... ну да, тоже элементарно подбирается.
                Ответить
    • показать все, что скрытоКакой багор )))
      Ответить
    • показать все, что скрытоЯ парень, 24 года. Хочу отсосать у кавказца. Пиши желательно с фото на [email protected], вышлю в ответ
      Ответить

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