1. Куча / Говнокод #18009

    +144

    1. 1
    2. 2
    3. 3
    ENCRYPT(str[,salt])
    Шифрует аргумент str, используя вызов системной функции кодирования crypt() из Unix. Аргумент salt должен быть строкой из двух символов (в версии MySQL 3.22.16 аргумент salt может содержать более двух символов):
    Если функция crypt() в данной операционной системе недоступна, функция ENCRYPT() всегда возвращает NULL. Функция ENCRYPT() игнорирует все символы в аргументе str, за исключением первых восьми, по крайней мере в некоторых операционных системах - это определяется тем, как реализован системный вызов базовой функции crypt().

    Сегодня при входе в админку сайта ошибся в последнем знаке 10 значного пароля, но успешно зашел. Повторил опыт опять успешно.
    Глянул в код там такая проверка
    AND password= ENCRYPT(concat('".mysqli_escape_string($ this->db_class->link,$pass)."',clients.salt),'SECRET_KE Y')";

    Теперь рву волосы на жопе.
    Говнокод мой.

    Запостил: Vasiliy, 16 Апреля 2015

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

    • Note
      The ENCRYPT() function is deprecated as of MySQL 5.7.6, will be removed in a future MySQL release, and should no longer be used. Consider using AES_ENCRYPT() instead.
      Ответить
      • другими словами, разрабам понадобилось ~20 лет что бы увидеть свет в конце тунеля.

        ЗЫ не шутка, http://en.wikipedia.org/wiki/MySQL :

        Initial release 23 May 1995; 19 years ago
        Ответить
        • А учитывая, что 5.1 и другие устаревшие версии на хостингах в изобилии, владельцы сайтов ещё долго будут рвать волосы на жопе.
          Ответить
          • > хостингах
            Да у этих ленивых и жадных распиздяев и PHP 4.0 в изобилии...
            Ответить
    • поэтой причине первый аргумент crypt()у часто предварительно хэшируют.
      Ответить
    • Тоже как-то на это нарвался, но в рамках crypt() у PHP. Если вся шифрация происходит внутри PHP, то (зная наперед о такой проблеме, конечно), можно обезопаситься от паранойи просытм юнит-тестом.
      Ответить
      • так в том то и дело не знал. Случайно заметил.
        Ответить
      • Да вообще сложные вычисления на стороне СУБД лучше не выполнять, чтобы не тратить её драгоценное время. Тем более, что даже в приведённом фрагменте кода есть вкрапления PHP.
        Ответить
      • Пардон, на что?
        Ответить
        • На "Функция ENCRYPT() игнорирует все символы в аргументе str, за исключением первых восьми", видимо.
          Ответить
          • на самом деле функция crypt игнорирует. а ENCRYPT её использует.
            Ответить
            • Я хуею. И нет никаких предупреждений красным цветов в доках?
              Ответить
              • нет. мелким шрифтом приписочка.
                Ответить
              • там "выберите себе свой алгоритм за счет префикса хэшируемого, однако в случае чего возьмится восьмисимвольный)
                Ответить
                • Не вижу http://php.net/manual/ru/function.crypt.php
                  Ответить
                  • CRYPT_STD_DES - Стандартное DES-шифрование с двухсимвольной солью из алфавита "./0-9A-Za-z""./0-9A-Za-z". Использование других символов в соли повлечет за собой отказ работы crypt().

                    Смысл в том, что если ничего остального не подходит, выбирается он. То ли я тогда доллар проебал, то ли он почему-то считался за подходящий символ, но выбирался именно DES.
                    Ответить
                    • >crypt() возвращает хэшированную строку, полученную с помощью стандартного алгоритма UNIX, основанного на DES
                      Это видно. Нигде не написано, что DES хеширует первые 8 символов (а не 7?)
                      Ответить
                      • не тот язык (и это я не про сам php) http://php.net/manual/en/function.crypt.php

                        upd хотя и на русском

                        Кроме того, она использует только первые восемь символов строки str, поэтому более длинные строки, начинающиеся с тех же восьми символов, сгенерируют один и тот же результат (при использовании одинаковой соли).
                        Ответить
                        • Написано в середине страницы. В общем, я не знаю, кто овощ, но должна же быть какая-то причина, по которой в пхп это используют, а в питоне - нет?
                          Ответить
                          • PHP долгое время считал нормой обнять сишную библиотеку и предоставлять идентичный интерфейс всем проходящим.
                            Ответить
    • Я просто оставлю это здесь: http://php.net/manual/ru/function.password-hash.php
      Ответить
      • нельзя без https://packagist.org/packages/ircmaxell/password-compat
        Ответить
    • cleaned
      Ответить
    • Я даже стесняюсь спросить о pbkdf2 и ко
      Ответить
    • cleaned
      Ответить
    • cleaned
      Ответить
    • cleaned
      Ответить

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