История изменений
Исправление
gh0stwizard,
(текущая версия)
:
Я не услышал внятного ответа почему perl лучше, чем скажем java. Вот вы пишете:
На python, java, php и других языках некоторые конструкции реализуются очень бестолково, а некоторые вовсе нельзя реализовать напрямую (только обходными путями). Программируя на этих недоязыках я чувствую себя мудаком когда пытаюсь реализовать определенные схемы но начинаю городить обходную хрень потому что язык ущербный. И ничего подобного я не встречал с perl и си (и как следствие, на с++ тоже можно обходиться без обходных путей).
Какие конструкции?
Видите ли, если вас заботит только как выглядит код, то для вас плохие новости. Я не стану цитировать Торвальдса о хороших программистах, гуглите сами.
Теперь о дыре в print undef. Вообще-то, я имел ввиду использование $1
вместо "$1"
там, где это неверно. Теперь вашими же словами: если вы и программист, то очень слабый, т.к. сильный программист знает об этой «фишке» perl, знает что выдаст print в этом случае, знает, что произойдет в его личном коде. Поскольку личного кода тут нет, а команда print сделана практически идеально, то вот вам пример в вашей стилистике:
#!/usr/bin/perl -wl
($test = "tt") =~ /^\w(\w+)?\w+/ && print ($1) && print "'$test' authorized";
В рекспе есть ошибка, чтобы специально показать, когда $1 может быть undef. Поскольку пример очень простой, то сразу видно, где именно. В более сложных регепсах это обычно бывает трудно заметить сразу, трудно определить при каком входном значении получим undef. Как итог, злоумышленник может провести атаку, которая в худшем (ключевое слово) приведет к дыре. В лучшем случае, к неверной работе программы.
И сразу скажу, что пример не показывает, где уязвимость и как ее использовать. Могу сказать, что если в коде начать использовать $1
таким образом $users{ $1 }
, то будет уже интереснее, но опять же пример взят с потолка.
Теперь вернемся к вашему примеру:
($test = "test") =~ /^(.*?)t/ && print $1;
Исходная версия
gh0stwizard,
:
Я не услышал внятного ответа почему perl лучше, чем скажем java. Вот вы пишете:
На python, java, php и других языках некоторые конструкции реализуются очень бестолково, а некоторые вовсе нельзя реализовать напрямую (только обходными путями). Программируя на этих недоязыках я чувствую себя мудаком когда пытаюсь реализовать определенные схемы но начинаю городить обходную хрень потому что язык ущербный. И ничего подобного я не встречал с perl и си (и как следствие, на с++ тоже можно обходиться без обходных путей).
Какие конструкции?
Видите ли, если вас заботит только как выглядит код, то для вас плохие новости. Я не стану цитировать Торвальдса о хороших программистах, гуглите сами.
Теперь о дыре в print undef. Вообще-то, я имел ввиду использование $1
вместо "$1"
там, где это неверно. Теперь вашими же словами: если вы и программист, то очень слабый, т.к. сильный программист знает об этой «фишке» perl, знает что выдаст print в этом случае, знает, что произойдет в его личном коде. Поскольку личного кода тут нет, а команда print сделана практически идеально, то вот вам пример в вашей стилистике:
#!/usr/bin/perl -wl
($test = "tt") =~ /^\w(\w+)?\w+/ && print ($1) && print "'$test' authorized";
В рекспе есть ошибка, чтобы специально показать, когда $1 может быть undef. Поскольку пример очень простой, то сразу видно, где именно. В более сложных регепсах это обычно бывает трудно заметить сразу, трудно определить при каком входном значении получим undef. Как итог, злоумышленник может провести атаку, которая в худшем (ключевое слово) приведет к дыре. В лучшем случае, к неверной работе программы.
И сразу скажу, что пример не показывает, где уязвимость и как ее использовать. Могу сказать, что если в коде начать использовать $1
таким образом $users{ $1 }
, то будет уже интереснее, но опять же пример взят с потолка.
Теперь вернемся к вашему примеру:
($test = "test") =~ /^(.*?)t/ && print $1;