Поделиться

четверг, 11 марта 2010 г.

Обучение безошибочности: 25 самых опасных программных ошибок и метод "подари другу грабли"!

25 февраля обновился список наиболее опасных программных ошибок (их тоже 25), публикуемый Институтом SANS и MITRE. Это весьма полезный документ для программистов (которые могут отобрать те ошибки, которые наиболее "близки" к выполняемой ими работе), для исследователей (поскольку ошибки ранжированы по уровню опасности и частоте обнаружения), для преподавателей (которым нужно каким-то образом заставить нынешних студентов не допускать этих ошибок или, хотя бы, помнить о них) и для любых других категорий специалистов. Бесполезен он только для пользователей, которым просто следует быть бдительными. Им, вообще, проще всего, но не потому, что бдительность что-то гарантирует, а потому что больше они ничего не могут сделать (работает принцип: "Сделай, что сможешь, и будь, что будет!").

Все ошибки, вошедшие в список, можно условно разделить на три категории по тому человеческому качеству, на котором они паразитируют: "Доверчивость" (например, к этой категории относится ошибка CWE-601: URL Redirection to Untrusted Site ("Open Redirect")), "Неаккуратность" (CWE-120: Buffer Copy without Checking Size of Input - классика жанра) и "Ложное ощущение защищенности" (CWE-327: Use of a Broken or Risky Cryptographic Algorithm). Я не буду их подробно рассматривать - в самом документе все очень хорошо разложено по полочкам, присутствуют подобающие метафоры и даже легкий юмор. Есть другой вопрос по теме блога: а можно ли научить будущих программистов не допускать промахов, которые впоследствии во время их трудовой деятельности могут вылиться в крупные неприятности?

Рассмотрим некоторые методы обучения:
  • "Ребята, бывают вот такие ошибки, их допускать не надо"! Конструктивно? - Ни разу!
  • "Ребята, представим себе, что это - настоящий сайт с ценной информацией. А вот так он ломается". Альтернативно: "Попробуйте его сломать". Чуть более захватывающе, но как только появляется слово "представим себе" - эффективность улетучивается. Дело опять в пресловутой разнице между теорией, учебной и реальной практикой. Я много раз говорил, что негативная роль этой разницы не так однозначна, чтобы с ней тотально бороться, но вот здесь тот случай, когда определенные вещи и отдельные характеристики modus operandi можно и нужно вбить в головы. Вымышленное злодейство на вымышленном сайте для этого не годится.
  • "Ребята, вот сайт IBM (Microsoft, Google, Рамблер, Yandex, Gametrailers - добавить по вкусу). А вот так он ломается"! Еще более захватывающе и более продуктивно, но... грозит.
По моему мнению, в обучении делать что-то правильно или не делать чего-то неправильно лучше всего работают страх и унижение (в разумных пределах). Дух соревнования тоже работает, хотя его значение часто переоценивают (здесь все зависит от темперамента соревнующихся, а также о того, не имеет ли кто-нибудь из них тенденцию к переходу в защитную стойку: "Я все равно лучше всех, и я это знаю"). Поэтому мне кажется, что оптимальным вариантом является следующий: студенты ломают сайты друг-друга, но в организованной академической манере. Скажем, параллельно преподаются две дисциплины "Разработка веб-сайтов" и "Информационная безопасность" (или "Безопасное кодирование" и "Испытания ПО" - как угодно). У группы студентов №1 первую половину семестра идет только "Разработка веб-сайтов", где они занимаются соответствующей деятельностью, а у группы №2 - "Информационная безопасность", где они изучают теорию и ломают сайты созданные студентами из группы №1. Каждую неделю проводятся совместные занятия, когда все студенты встречаются и "делятся впечатлениями". Во второй половине семестра группы "меняются дисциплинами".

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

Комментариев нет:

Отправить комментарий