Что каждый программист должен знать о безопасности? [закрытый]

Я студент ИТ, и я сейчас на 3-м курсе в университете. До сих пор мы изучали много предметов, связанных с компьютерами в целом (Программирование, алгоритмы, компьютерная архитектура, математика и т. д.).

Я очень уверен, что никто не может узнать все о безопасности, но уверен, что есть" минимальные " знания, каждый программист или ИТ-студент должен знать об этом, и мой вопрос в том, что это за минимальные знания?

можете ли вы предложить некоторые электронные книги или курсы или что-нибудь может помочь начать с этой дороги?

17 ответов


принципы, чтобы иметь в виду, если вы хотите, чтобы ваши приложения были безопасными:

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

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

обучите своих разработчиков безопасности приложений best pratices

Codebashing (оплачено)

Инновации В Области Безопасности(платная)

Безопасность Компаса (платная)

OWASP WebGoat (бесплатно)


Правило № 1 безопасности для программистов:Не сворачивайте свой собственный

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

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


каждый программист должен уметь писать код эксплойта.

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


безопасность-это процесс, а не продукт.

многие, кажется, забывают об этом очевидном деле.


Я предлагаю рассматривать CWE / SANS ТОП-25 самых опасных ошибок программирования. Он был обновлен на 2010 год с обещанием регулярных обновлений в будущем. The 2009 редакция также доступна.

от http://cwe.mitre.org/top25/index.html

2010 CWE / SANS Top 25 самых опасных ошибок программирования-это список наиболее распространенных и критических ошибок программирования, которые может привести к серьезным уязвимостям программного обеспечения. Их часто легко найти и легко использовать. Они опасны, потому что часто позволяют злоумышленникам полностью завладеть программным обеспечением, украсть данные или вообще запретить работу программного обеспечения.

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


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


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


важность безопасных значений по умолчанию в фреймворках и API:

  • многие ранние веб-фреймворки не избежали html по умолчанию в шаблонах и имели проблемы с XSS из-за этого
  • множество ранних веб-фреймворков облегчили конкатенацию SQL, чем создание параметризованных запросов, приводящих к множеству ошибок SQL-инъекций.
  • некоторые версии Erlang (R13B, возможно, другие) не проверяют сертификаты одноранговых ssl по умолчанию, и, вероятно, есть много код erlang, который подвержен атакам SSL MITM
  • преобразователь XSLT Java по умолчанию позволяет выполнять произвольный код java. Было много серьезных ошибок безопасности, созданных этим.
  • API синтаксического анализа Java по умолчанию позволяют проанализированному документу читать произвольные файлы в файловой системе. Больше удовольствия :)

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


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

Я бы добавил следующее:

  • как работают цифровые подписи и цифровые сертификаты
  • что такое песочница

понять, как работают различные векторы атаки:

  • переполнение буфера/underflows / etc на собственном коде
  • социальная engineerring
  • DNS-спуфинг
  • человек-в-середине
  • CSRF / XSS et al
  • SQL-инъекций
  • крипто-атаки (ex: использование слабых алгоритмов шифрования, таких как DES)
  • Ошибки программы / фреймворка (например: github's последний недостаток безопасности)

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


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

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

вы можете найти больше ресурсов безопасности по следующим ссылкам:

для получения дополнительной информации google о потоках безопасности поставщика приложений.


  1. почему это важно.
  2. Это все о компромиссах.
  3. криптография в значительной степени отвлекает от безопасности.

для общей информации по безопасности, я настоятельно рекомендую читать Брюс Шнайер. У него есть сайт, его крипто-грамм бюллетень, несколько - книги, и сделал много интервью.

Я бы также познакомился с социальной инженерией (и Кевин Митник).

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


также не забудьте проверить список Топ-10 OWASP для категоризации всех основных векторов атаки / уязвимостей.

об этих вещах интересно читать. Научившись думать как атакующий, вы научитесь думать о том, о чем думать, когда вы пишете свой собственный код.


соль и хэш пароли ваших пользователей. Никогда не сохраняйте их в базе данных открытым текстом.


просто хотел поделиться этим для веб-разработчиков:

security-guide-for-developers
https://github.com/FallibleInc/security-guide-for-developers