10 типичных ошибок программирования

Банальные, но очень опасные.
13 ноября 2017326451Илья Бубнов2248510

 

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

Переполнение буфера

Исторически одна из самых опасных ошибок. Именно благодаря ей на свет появились черви Морриса и Nimda, которые в сумме заразили несколько миллиардов компьютеров. Суть ошибки проста: из-за неправильного вычисления позиций записи в память пользователь может внести данные «за пределы» буфера. В лучшем случае, это приведёт к ошибке, а потенциально – к тому, что хакер добавит в исполняемый код «вредоносные» вставки. Вот как это работает графически:

SQL-инъекция

SQL инъекция – хакерская атака, позволяющая получить им прямой доступ к базе данных. Используя простую конкатенацию SQL-команд, злоумышленники считывают базы данных, удаляют и добавляют данные, устанавливают собственные ссылки.

Ключевой причиной успешных атак является ПО, которое обрабатывает вводные данные пользователя и отправляет их на SQL-запрос, но не обеспечивает необходимый уровень безопасности.

Инъекции команд ОС

Некоторое ПО использует встроенные команды операционной системы, например, для извлечения данных компьютера или запуска приложения. В этом случае, здесь может возникнуть схожая ошибка – инъекции команд вашей ОС. Без надлежащей проверки введённых данных, злоумышленник получает возможность влезть в ваш компьютер, изменить разрешения файлов, установить приложение, украсть данные или удалить что-то важное. Как это происходит – представляют более-менее все, кто хоть раз имел дело с компьютерным вирусом.

Переполнение числовых типов

Любой тип в любом языке программирования имеет свои пределы. Например, в 2-байтовое число без знака вы можете записать максимум 65535.

Теперь представьте, что вам надо сложить 2 числа этого типа 65530 и 20.

Результат 65555 не впишется в тип short, а на выходе вы получите непредсказуемое значение. Таким образом, дальнейшая работа с этой переменной приведёт к заведомо неправильному результату.

Неправильная оценка размера массива

Бытует стереотип, что ошибки доступа к несуществующему индексу массива возможны только в C или C++, так как здесь используется ручное управление памятью. Это не так: в Java, Python, JavaScript и других «автоматических» языках подобные просчёты разработчика – не редкость. При неправильной оценке индекса массива пользователь получает доступ к неиспользуемым ячейкам памяти. Это, в свою очередь, приводит к критическим ошибкам в программе.

Использование ресурсов без ограничений

В ручном распределении памяти проблема имеет глобальный характер. Без проверок и ограничений происходит сбой распределения – одни данные занимают пространство, потенциально предназначенное для других. В результате они или игнорируются, или возникает ошибка, или вы получаете программу, которая будет «съедать» всю память машины во время исполнения.

К этому виду ошибок можно отнести и создание безразмерных массивов, потоков, использовании дескрипторов файлов или соединений в БД без проверки и закрытия.

Указатель на освобождённую память

В таких языках, как C и C ++, память должна быть освобождена, как только вы закончите с ней работать. Дальнейшее использование указателей на этот блок памяти приводит к ошибкам. Несмотря на очевидность описанного, в новостях вновь и вновь всплывают случаи «заморозки» крупных программных систем из-за этого сбоя.

Вывод нулевого указателя

До инициализации указатель имеет нулевое значение. Работа с ним приводит к ошибке. К примеру, в Java это NullPointerException. Ошибка хоть и детская, но очень распространена, поэтому избежать появления в этом рейтинге не могла.

Отсутствие инициализации

Локальные переменные существуют только внутри функции или небольшого блока, поэтому иногда программисты игнорируют их нормальную инициализацию. Между тем, если присвоение стартового значения оставить на откуп ПО, вместо ожидаемого нуля или пустого символа, вы можете увидеть ошибку Missing Initialization или какой-то мусор из памяти.

Рискованные алгоритмы

При работе с персональными данными необходимо надёжно их защищать. Не стоит полагаться на собственные силы, ведь в мире существует множество готового ПО и алгоритмов, которые работают куда лучше вашего неопытного мозга. Впрочем, даже к их использованию надо подходить с умом. Так алгоритм хэширования SHA-1 устарел и легко взламывается современными хакерами, поэтому стоит отдать предпочтение SHA-2 или SHA-3. В противном случае, вы рискуете не только репутацией своего ПО, но и вполне осязаемыми деньгами.

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

Основано на статье Jay Sridhar для портала MakeUseOf.

Новые комментарии