1. Perl / Говнокод #3972

    −117

    1. 1
    2. 2
    if ( $src =~ /^(.+)$/ ) { $src = "$1"; }
    if ( $dst =~ /^(.+)$/ ) { $dst = "$1"; }

    Еще один вариант проверки на непустую строку.

    Запостил: mrtaryk, 13 Августа 2010

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

    • не говно. это официальный способ в Перле как tainted данные сделать untained. ну это если перл с -T опцией запускают.

      http://perldoc.perl.org/perlsec.html , цитирую:

      Taint mode

      While in this mode, Perl takes special precautions called taint checks to prevent both obvious and subtle traps. Some of these checks are reasonably simple, such as verifying that path directories aren't writable by others; careful programmers have always used checks like these. Other checks, however, are best supported by the language itself, and it is these checks especially that contribute to making a set-id Perl program more secure than the corresponding C program.

      вобщем, в это режиме перл помечает все данные которые приходят из внешних источников специальным флагом, и пока код их не "почистит", при попытке использования этих данных, перл обломит выдаст ворнинг и может быть даже остановит исполнение.
      Ответить
      • типа $src=$src;
        Ответить
        • да. но если сделать просто "$src = $src", то флаг что данные tainted не будет сброшен и перл в этом режиме будет матюгатся что программа пытается левыми непровереными данными пользоватся.

          популярно для CGI & setuid скриптов - что бы не забывать ввод от пользователя проверять.
          Ответить
          • ну это же сделано, что бы чистить ввод, а не просто сбрасывать флаг. Следовательно, сабж все таки подванивает
            Ответить
            • ну например если эти строчки есть вывод какой другой программы - например md5 - тип вывода как бы заранее известен и сильно результат не проверишь. все что остается сделать это сбросить этот флаг.
              Ответить
              • но это все допущения.если по-правде, то и правильно, это тоже внешние данные.
                может быть, это паранойя, но если программа не проверит, что это действительно нечто похожее на md5 - то ей можно подать на вход и не md5, а все, что захочешь (подменив источник) - уязвимость налицо.
                Ответить
                • параноя. а вдруг там в числах какая магия? при посылке по сокетам выжыгающая монитор пользователя??

                  ЗЫ что бы /usr/bin/md5 подменить, надо рутом быть. а если уже кто-то имеет рута, то зачем страдать херней с подменой md5?
                  Ответить
                  • все очень и очень зависит, но например:
                    у нас есть step1.pl, который обрабатывает данные и вызывает step2.pl, передавая данные для вывода. Если мы можем вызвать step1.pl, то можем вызвать и step2.pl c произвольными данными, и если step2.pl не проверит их корректность, то.......

                    напротив, если мы в ООП обьекте имеем два приватных метода, то будет излишеством, если каждый из них будет проверять, а не передал ли какой нибудь из них неочищенные данные.....
                    Ответить
                  • дискуссию можно бы и продолжать, но я толкую вот о чем: максимально ограничить ввод.
                    например, если в $md5 мы ждем только md5-хеш, то вместо сабжевого if ( $md5 =~ /^(.+)$/ ) { $md5 = "$1"; }, который вы взялись защищать, можно написать хотя бы if ( $md5 =~ /^\w+$/i ) { $md5 = "$0"; } else { $md5 = ""; }

                    и на закуску предлагаю раскурить http://gunther.web66.com/FAQS/taintmode.html#clear_taint
                    Ответить
                • ну это не то что бы я говорю что параноя это плохо.

                  в безопастности данных есть такое высказывание: "I'm paranoid. But am I paranoid enough?"
                  Ответить
      • и еще, что не сразу просек. Все таки говно. Потому что, если $src или $dst не пройдут цензуру, то их оставляют в покое. Явно не хватает веток else { $src = ""; } и else { $dst = ""; }, иначе перл будет бить по жопе
        Ответить
    • Перл такой перл :)
      Ответить
    • - Смотри, там твой муженёк со своей группой поддержки.
      Ответить

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