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

Ниже приведены некоторые из наиболее распространенных ошибок программирования и кодирования, допущенных разработчиками. Эти ошибки привели к широко распространенным сбоям, краже данных, вторжениям и многому другому. Некоторые из ошибок

специфичны для определенных языков, таких как C, C ++ и т. д., но некоторые распространены для других языков, таких как Java, JavaScript, Python и т. д.

Мы рекомендуем вам часто проверять этот список, чтобы убедиться, что вы не делаете ничего из этого в своем коде. Этот список отсортирован в порядке важности сверху вниз.

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

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

в 1988 году червь W32 / Nimda в 2001 году и ошибка Sendmail в 2003 году.

Пример A C:

char array[6] = "hello";
strcat(array, ", joe"); /* <- This line causes a buffer overflow. */

10 самых распространенных ошибок программирования и кодирования Переполнение буфераИзображение предоставлено: Cyber4All @Towson

2. SQL-инъекция

SQL-инъекция

это методика введения команд SQL в пользовательский ввод, так что эти команды непосредственно выполняются базой данных. Это позволяет злоумышленнику выполнять злонамеренные действия, такие как удаление таблиц, удаление баз данных, кража данных и многое другое.

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

Пример Java:

// The following is a parameter value with SQL injection
String username = "joe'; delete from user where username like '%";
Connection con = ...; // create connection to database
// When this statement is executed, all users are deleted from the database.
con.createStatement().execute("update user set logged_in = 1 where username = '" + username + "'");

3. Инъекция команды ОС

Внедрение команд ОС возникает, когда пользовательский ввод напрямую передается операционной системе для выполнения приложением без надлежащей проверки. Такая операция может использоваться приложением для использования существующей команды в ОС. Когда приложение передает пользовательский ввод без надлежащей проверки, оно позволяет злоумышленнику использовать умные конструкции для выполнения вредоносных команд. Этими командами могут быть, например, удаление файлов, кража данных, изменение прав доступа к файлам и многое другое.

4. Целочисленное переполнение или обтекание

Целое число

Ошибка переполнения возникает, когда вы пытаетесь сохранить большее значение в целочисленном типе, чем подходит. Когда это происходит, большее значение усекается, и операция заканчивается сохранением непредсказуемого результата. Например, 2-байтовое короткое число без знака может хранить максимальное значение 65535. Теперь представьте, что вы добавляете два коротких значения, таких как 65530 и 10, и сохраняете результат в коротком. Результат (65545) не будет соответствовать короткому замыканию, что приведет к непредсказуемому значению короткого замыкания в результате усечения. При последующем использовании этого значения в другой операции (такой как индекс массива) вы получите непредсказуемые результаты.

Пример A C:

short a = 65530, b = 10;
short c = a + b;
// on my computer, c has the unexpected value: 4

5. Неправильная проверка индекса массива

Другой очень распространенной ошибкой, встречающейся в программном обеспечении, является неправильная проверка индекса массива. Возникает при доступе к массиву

используя индекс, который находится за пределами массива. Когда вы получаете доступ к расположению за пределами действительных границ данных программы, вы получаете ошибку доступа к памяти (также известную как нарушение сегментации). Когда ячейка памяти находится в пределах границ данных, но за пределами массива, вы просматриваете повреждение памяти при записи в такие места.

Ошибки такого типа чаще встречаются в C и C ++, но могут возникать с любым языком, даже с теми, которые имеют автоматическое управление памятью, такими как Java, JavaScript, Python и т. Д. Единственный способ, как эти ошибки можно устранить в программном обеспечении, - это вы программист, проявляющий достаточную осторожность при кодировании.

6. Распределять ресурсы без ограничений

Распределение памяти очень распространено в C и C ++, так как все управление памятью на этих языках осуществляется вручную. Выделение памяти без правильной проверки выделяемого размера может привести к сбою выделения. Когда результат этого распределения не проверяется, а используется напрямую, у вас есть рецепт для катастрофы.

Ошибки такого типа также возможны без ручного управления памятью, такого как Java, JavaScript и Python при выделении массивов. Поэтому при распределении массивов на этих языках необходимо соблюдать осторожность.

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

7. Истек срок обращения указателя

В таких языках, как C и C ++, память может быть освобождена, как только вы закончите с ней. Использование указателя

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

8. Обращение по нулевому указателю

Указатель может иметь нулевое значение до его правильной инициализации (или после освобождения памяти). Разыменование такого указателя вызывает ошибку нулевого указателя (в Java называется NullPointerException). Это очень распространено в C, C ++, а также в Java, и определенно возможно и в других языках. Вы должны быть достаточно внимательны в своем коде, чтобы избежать такого рода ошибок.

нулевой указательИмиджевый кредит: J.T.Presta

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

Локальные переменные - это те, которые объявлены внутри функции (или блока) и перестают существовать в конце функции. Эти переменные размещаются в стеке и будут иметь случайный мусор при первом объявлении. Как программист, вы обязаны назначить подходящие значения этим переменным, как только они будут объявлены. Использование их до такой инициализации приводит к ошибке Missing Initialization и, скорее всего, приведет к сбою (или что-то более разрушительное).

Пример A C:

int pos;
char buffer[] = "hello world";
// this line may print garbage and/or may crash the program since pos is not initialized.
printf("Value of character at pos %d is: %c\n", pos, buffer[pos]);

10. Сломанный или рискованный криптографический алгоритм

Мир криптографии

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

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

Резюме

Мы рассмотрели некоторые из наиболее распространенных ошибок программирования и кодирования в этой статье. Вы можете часто обращаться к этому списку, чтобы убедиться, что избегаете их.

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

Кредит изображения: ajfile / Depositphotos

Ссылка на основную публикацию
Adblock
detector