Неожиданно правильное поведение программ

Периодически сталкиваюсь с такой ситуацией, когда та или иная система не должна работать, но почему-то работает. Не люблю такие ситуации по двум причинам — сложно отлавливать, и коллеги смотрят косо… работает ведь, чего тебе надобно.

А как вы относитесь к подобному «искусственному интеллекту»?

С одной стороны вроде как работает ведь. И в 90% случаев оказывается, что я когда-то давным давно предусматривал что-то, что позволило ему так работать. С другой стороны — раз не ясно почему оно работает, то оно может работать неправильно, а значит быть уязвимо.

Пример — сегодня показывал коллеге тест одной библиотеки которую я сейчас пишу.

И заметил что я там сделал опечатку. Вместо:

$data = $zarplata->read('money<?',100);

написал

$data = $zarplata->read('money<',100);

т.е. пропустил плейсхолдер.

Оказалось что код отработал верно, и по результатам теста все было ок.

Разбор полетов показал, что работало оно за счет того, что:

list($str_start,$str_end) = explode('#',$where,2);

спокойно отдает $where как начало строки, и пустую строку как окончание.

Но есть одно но — это отрабатывается в коде по обработке плейсхолдера # а значит и эскейпится и оформляется он несколько иначе. Итог — готовая sql-инъекция.

При правильном проектировании на самом деле часто бывает, что оно работает, и ты не понимаешь почему, и это нормально… но при неправильном может быть и такое…

Вот скажите мне, я параноик который случайно был вознагражден за свою паранойю или так правильно? :)
  • Вопрос задан
  • 2634 просмотра
Пригласить эксперта
Ответы на вопрос 6
TheEternal
@TheEternal
Само собой, надо чинить. Пока оно у программистов — чинить дешево. Если сломается, будучи под нагрузкой — чинить будет очень дорого, это Вам любой QA скажет.
Куда как хуже, когда от QA приходит баг, а после разбирательства, выясняется, что работать оно из-за этого бага не могло уже очень давно, но ведь работало как-то…
Ответ написан
Комментировать
AmdY
@AmdY
PHP и прочие вебштучки
Для этого и нужно МОДУЛЬНОЕ тестирование, оно бы выявило недостатки парсинга where. А в скопе, дейтвительно, ошибки могут наложиться и дать правильный результат.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
«Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле.» (С.Макконнелл, цитата из «Совершенный код»)

> При правильном проектировании на самом деле часто бывает, что оно работает, и ты не понимаешь почему, и это нормально…
И это ненормально и указывает на то, что что-то идёт не так. Сейчас 1 человек не понимает, как это работает, завтра — половина коллектива — через год — никто не знает. Что является прямой причиной роста числа дефектов.
Ответ написан
@egorinsk
Не верю в чудеса и неожиданности.

Зато верю в то, что чем строже и больше различных проверок ввести, тем больше ошибок выскочит. Для этого:

1) ставлю error_reporting в -1 (показывать абсолютно все ошибки, включая всякие deprecated и strict standarts)
2) Иногда делаю код, преобразующий любую малейшую ошибку в исключение, валящее всю программу (в не-PHP языках это часто по умолчанию так и есть, и это правильно)
3) указываю type hints — если в функцию должен придти массив или объект определенного класса, то так и пишу
4) Ставлю assert() массово. Если переданный в функцию массив не должен быть пуст, а другая переменная не может быть отрицательной, проверяю это
5) Не использую @ и не исправляю ошибки, пока не пойму причину (так как реальная ошибка может быть в вызывающем коде)
6) В штуках, которые принимают плейсхолдеры, всегда проверяю соответствие числа плейсхолдеров и переданных данных
7) Жалею, что в PHP нет (или уже есть?) type hints для скалярных типов

> При правильном проектировании на самом деле часто бывает, что оно работает, и ты не понимаешь почему, и это нормально…

Нет, не бывает. Вы просто плохо разбираетесь в коде или особенностях языка.
Ответ написан
KIVagant
@KIVagant
Разработчик web-сервисов
Недавно выпилил старый код из программы, где вместо проверки на тип стояло приведение к типу. Код работал много лет на многих сервисах и никто не замечал. А могло однажды выйти боком. Так что да, надо сразу искать и разбираться.
Ответ написан
Mendel
@Mendel Автор вопроса
PHP-developer
Ну и да, раз уж ушли от темы «неожиданно ПРАВИЛЬНОЕ», в сторону просто ошибок, то вот еще пример:
в 2006 году, когда под пхп5 уже начинал писать, но еще так, чтобы пхп4 работал…
Писал библиотеку авторизации.
И мучали меня сомнения… но так и не придумал почему мне все-таки не использовать $_REQUEST вместо $_GET + $_COOKIE.
Не придумал. Написал.
Сейчас библиотека сдохла. Почему? Оказывается в 5.3 появилась request_order.
====
Вот здесь как раз я признаю нарушение самого главного правила разработки: «Слушай свою жопу. Если она говорит не делай — не делай». А все остальное — общие слова. :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы