Чистый и безопасный код — миф или реальность?

Чистый и безопасный код — миф или реальность?

«Программирование — это искусство сообщать другому человеку, что он хочет от компьютера»

Дональд Кнут

Каждый язык программирования разработан с учетом разных операционных систем, платформ, стилей кодирования и предполагаемого использования. Обычно мы слышим о языках Python, PHP, Ruby, JavaScript, Java, C, C++ и C#, а также более современных их разновидностях, такие как Rust, Swift, Hack и многих других.

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

Что такое чистый код?

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

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

Чистый и безопасный код — миф или реальность?

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

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

Небрежно написанный код стоит дорого, а на его обслуживание уходит много времени и усилий. Кроме того, код более подвержен ошибкам, которые могут привести к сбою программы.

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

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

Отладка — это исправление ошибок в коде.

Тем не менее даже чистый код имеет срок годности. Программное обеспечение и вычисления существуют в быстро меняющемся ландшафте. Код, который раньше был чистым, устаревает.

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

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

Критерии, по которым код может считаться чистым

  • Отсутствие избыточности кода

Код должен соответствовать правилу DRY (Don’t repeat yourself с англ. — «не повторяйтесь»). Это означает, что любое изменение в одном участке не должно требовать изменений в других.

  • Минимум зависимостей

Если в коде существует множество зависимостей, его сложнее поддерживать или изменять в будущем.

  • Минимум расширений

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

  • Функциональность и легкочитаемость кода

Код должен быть прост, удобен и понятен, чтобы любой разработчик мог его быстро прочитать. Для этого многие разработчики используют правила KISS (keep it simple and straightforward с англ. — «сохраняйте простоту») и YAGNI (You aren't gonna need it с англ. — «вам это не понадобится»).

  • Анализ кода

Используйте языковые инструменты статического анализа для проверки вашего кода.

Качество кода и безопасность кода

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

Почему безопасность отходит на второй план?

  • Сегодня в мире разработки функциональность и скорость перевешивают безопасность. Предприятия не могут опережать конкурентов, не создавая и не выпуская новые фичи в короткие сроки.
  • Безопасность не является конкурентным отличием: потребители не думают о безопасности при использовании приложения или при покупке умного устройства, будь то умный термостат или лампочка. Вспомним инцидент из 2020, когда дрон смог взломать умные лампочки Philips Hue и вызвать вирусную реакцию.

Согласно отчету Veracode, более трех четвертей (75,8%) приложений имеют хотя бы один недостаток безопасности, а 23,7% содержат недостатки высокой степени серьезности, и исправление этих недостатков обычно занимает месяцы.

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

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

Из-за уязвимостей в коде хакеры и совершают атаки на устройства. Так, они могут украсть информацию, вмешаться в работу устройства или удалить всю важную для вас информацию.

Уязвимости кода

Список существующих уязвимостей довольно длинный, поэтому мы рассмотрим лишь некоторые из часто встречающихся, а также те, которые причиняют наибольший ущерб. Согласно исследованию одними из наиболее популярных уязвимостей являются: Information leakage (утечка информации) — 65,9%; Cross-Site Scripting (XSS, межсайтовый скриптинг) — 47,1%; SQL Injection (внедрение SQL-кода) — 27,8%.

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

В идеальном мире разработчик (самостоятельно или с привлечением специалистов) тестирует продукт на проникновение, применяя наиболее популярные и новые методы взлома, а после анализирует полученный результат и делает выводы.

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

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

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

Полезные ресурсы

Что почитать?

  • «Чистый код. Создание, анализ и рефакторинг», Роберт Мартин

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

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

  • «Рефакторинг. Улучшение существующего кода», Мартин Фаулер

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

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

  • «Совершенный код» (Code Complete), Стив Макконнелл

Это высоко ценимая книга в индустрии разработки ПО. Основной посыл — «ошибки в программном обеспечении возникают из-за сложности кода». Книга была написана почти 30 лет назад, с тех пор идеи прочно вошли в сообщество разработчиков программного обеспечения.

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

Одним из недостатков является большой объем книги и то, что она, похоже, в основном ориентирована на объектно-ориентированные языки (C ++, Java) и даже более старые императивные (C, Ada и т. Д.)

  • Прочитайте дополнительно о принципах YANGI, DRY, KISS и SOLID.

Что посмотреть?

  • Amigoscode — ускоренные курсы программирования, курсы безопасности и учебные пособия по программированию. Для начинающих программистов этот канал предоставит множество полезных советов, практических примеров и сценариев.
  • The Coding Train — самый оптимистичный программист на YouTube. Дэниел Шиффман, автор канала, помимо того, что является преподавателем в университете, создает массу отличного контента, в основном состоящего из учебных пособий и задач по программированию.
  • DevTips — канал содержит много уроков по CSS и JavaScript, выпуски о различных нюансах и хитростях в работе с кодом.
  • HackerOne — это коллекция видеороликов, которые научат вас всему, что нужно для работы в качестве багхантера.
  • Computerphile — образовательные видео о компьютерах и компьютерных вещах. Есть серии видеороликов, связанных с темой кибербезопасности.
  • Derek Banas — видеоуроки профессионального уровня почти по всем популярным языкам программирования. Тут туториалы по JavaScript, React, C++, ML, Arduino, C#, Django и по многим другим направлениям.

Проверка кода

  • SonarQube — проверяет чистоту коммитов, готовность ваших проектов к выпуску и насколько хорошо ваш код соответствует цели. А если вы не попали в цель, вы сразу узнаете, что не так и как это исправить.
  • Fortify — платформа безопасности приложений, которая автоматизирует тестирование на протяжении всего процесса непрерывной интеграции, чтобы разработчики могли быстро решать проблемы.
  • Cppcheck — это инструмент статического анализа кода C/C ++, анализирующий код с целью обнаружения ошибок и с фокусом на обнаружении неопределенного поведения и опасных конструкций кода. Цель состоит в том, чтобы уменьшить количество ложных срабатываний.
  • Tabnine — инструмент автозавершения кода, основанный на искусственном интеллекте.
  • Prettier — это средство для форматирования кода с поддержкой множества языков, которое нацелено на использование жестко заданных правил по оформлению программ.
  • ESLint — линтер для JavaScript. Невероятно полезен, потому что JavaScript, будучи интерпретируемым языком, не имеет этапа компиляции и многие ошибки могут быть обнаружены только во время компиляции. ESLint позволяет разработчикам обнаруживать проблемы с кодом JavaScript, не выполняя его.
  • EditorConfig — конфигурационный файл и набор расширений для настроек синтаксиса. Помогает поддерживать единый стиль кодирования для нескольких разработчиков, работающих над одним проектом в разных редакторах и IDE.

Образовательные платформы

  • Hack the Box (HTB)

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

  • Академия Digital Security

Платформа от Академии Digital Security — бесплатная платформа по обучению кибербезопасности, которое построено на игровых механиках и нацелено на отработку практических навыков на реальных кейсах, развернутых на виртуальных машинах. Курсы разработаны действующими пентестерами и исследователями в области информационной безопасности.

Курс «Веб-безопасность» содержит обзор самых распространенных атак, ключевых мер защиты веб-приложений (корпоративных порталов, ДБО, систем электронной коммерции и т.д.) и методов аудита кода. С курсом «Безопасное программирование на Java» вы сможете развить навыки защиты, выполняя задания на эксплуатацию и исправление кода в приложениях, написанных на Java. При этом результаты будут видны сразу на живом приложении.

  • Pentestit

На платформе Pentestit есть программы практического обучения в области информационной безопасности: Zero Security: A и Corporate Laboratories. Учебный процесс включает теоретические и практические занятия, на которых опытные инструкторы Pentestit рассказывают о характере и способах обнаружения уязвимостей.

«Zero Security: A» — это программа начального обучения тестированию на проникновение Pentestit, в рамках которой стажеры осваивают различные инструменты тестирования на проникновение и изучают основы этического взлома: от разведки и сбора информации до обеспечения безопасности в системе.

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

Одна из самых известных и популярных образовательных платформ. На сегодняшний день у них есть учебники по HTML, CSS, Sass, JavaScript, Rails, AngularJS, ReactJS, Ruby, Command Line, Git, SQL и Java.

***

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

66
2 комментария

Миф. Следующий вопрос. 

2
Ответить

Помню как то в одной игре писал код. Иногда редактировал код из других материалов, но там кода на 200 тысяч строчек. Из особенностей, отладчик или дебаггер перестает работать уже на 5 тысяч строк кода - просто нельзя ничего сделать, курсор зависает даже если выключить всё.

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

Первым на помощь пришел инструмент отмена действия - благо sublime text это делать позволяяет. Скопировал момент с ошибкой, и отменяешь анализируя или проверяяя результат.

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

Писать код без ошибок - это надо иметь тягу. Когда я начал, в один момент затянуло неслабо, я 2 ночи не спал (и дня), то есть 3 суток коддинга.

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

Потом была пауза. Армия. Вернулся, думал я сис админ.
В итоге, в свободное время стал писать игры в браузере для себя.
Позже занялся рекламой, так как всё так же сис-админил.

И только в 2017 году обнаружил, что все эти навыки ценны. Но я всё это делал для себя) Так что, кто то занимается для себя, а кто то ради другой цели, поэтому и есть всегда эта проблема "а почему код грязный?".

Ответить