В одном из выпусков известного веб-комикса xkcd мать поднимает телефонную трубку. Звонят из школы, где учится её сын. «Он опять что-то сломал?» — спрашивает она. «В некотором роде, — отвечает телефон. — Скажите, вашего сына в самом деле зовут Роберт’); DROP TABLE Students; ––?»

exploits_of_a_mom

«Конечно», — отвечает она. Выясняется, что из-за кода SQL в имени школа из комикса лишилась базы данных с оценками учеников за целый год. «Надеюсь, это научит вас фильтровать входные параметры», — говорит в конце героиня.

Шутки шутками, но люди сталкиваются с подобной проблемой не только в комиксах. «Би-би-си» рассказывает об одной из жертв прогресса — американке по фамилии Null. Перед свадьбой будущий муж предупредил её, что эта фамилия порой вызывает трудности. Он не шутил.

Первая же попытка купить авиабилет через интернет закончилась провалом. Большинство сайтов, которые торгуют авиабилетами, выдавали ошибку. Они игнорировали слово «Null», введённое в форму, и требовали заполнить поле «Фамилия» снова.

Источник ошибки очевиден каждому, кто знает SQL. Cистемы управления базами данных могут считать значение Null признаком того, что в поле отсутствует информация. О том редком, но вполне реальном случае, когда слово «Null» — это и есть данные, разработчики систем продажи авиабилетов не подумали.

И не только они. Проблемы преследуют обладательницу редкой фамилии повсюду. Она столкнулась с аналогичной ошибкой при попытке отправить налоговую декларацию, а её мужу пришлось потрудиться, чтобы оформить платежи за коммунальные услуги.

Сложность заключается в том, что каждый такой случай уникален. Если позаботиться о правильной обработке фамилии Null, найдётся что-нибудь ещё. Есть люди, у которых фамилия длиннее места, отведённого под неё в базе данных. У других фамилии просто нет. У третьих имя и фамилия идут не в том порядке, на который рассчитывали разработчики. Предусмотреть всё почти невозможно.



6 комментариев

  1. undying

    29.03.2016 at 01:19

    Чет подозрительно. По идее данные вставляются как строки, либо цифры либо булевые значения. Если приехала строка «Null», а не значение Null, то никакого криминала не произойдет.

  2. schoolboy

    29.03.2016 at 05:08

    У оракла (» is null) = true. А уж у самописных валидаторов и не такое бывает когда 3VL пытаются реализовать.

    • schoolboy

      29.03.2016 at 05:15

    • undying

      29.03.2016 at 06:37

      Так тут то речь не о пустой строке, а о том, что у автора статьи «Null» == Null, что как то не реалистично выглядит.

      • ShadowHD

        29.03.2016 at 09:56

        Так принимать все входные данные как строку — и есть правильно, но некоторые быдлокодеры либо забивают на это, либо ставят криворукие парсеры, которые реагируют не только на ‘);, но и на сами команды, тот же null.
        К слову, кроме слишком коротких полей для ввода встречаются и слишком длинные — когда умники ставят ограничение на ввод минимум 3х символов…

Оставить мнение