Параноидальное отношение: Какова ваша степень в отношении безопасности в Интернете?

этот вопрос может быть связан с субъективным вопросом, но это не совсем один.

При разработке веб-сайта вы должны знать несколько моментов: атаки XSS, SQL-инъекция и т.д. Это может быть очень сложно (и занять много времени, чтобы закодировать), чтобы обеспечить все возможные атаки.

Я всегда пытаюсь защитить свое приложение, но не знаю, когда остановиться.

Возьмем тот же пример: социальные сети, подобные Facebook. (Потому что веб-сайт банка должен обеспечить все его данные.)

Я вижу несколько подходов:

  • Не защищайте XSS, SQL-инъекцию... Это можно сделать, когда вы доверяете своему пользователю: конец для частного предприятия. Но защищаете ли вы этот тип приложения?

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

  • Защитите все, все и все: вы сохраняете все данные (владелец или нет): пользователь не может сломать собственные данные и другие пользовательские данные: это очень долго, и это очень полезно?

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

Ну, я не знаю, что делать... Для меня я стараюсь делать 1, 2, 4, но я не знаю, если это отличный выбор.

Есть ли приемлемый риск, чтобы не защищать все ваши данные? Могу ли я защитить все данные, но мне нужно удвоить время, чтобы закодировать вещи? Что подход предприятия к риску и "время - деньги"?

Спасибо, что разделили это, потому что я думаю, что многие разработчики не знают, что является хорошим лимитом.

EDIT: я вижу много ответов, говорящих о XSS и SQL-инъекциях, но это не единственное, о чем нужно заботиться.

Возьмите форум. Поток можно писать на форуме, где мы модератор. Поэтому, когда вы отправляете данные в клиентское представление, вы добавляете или удаляете кнопку "Добавить" для этого форума. Но когда пользователь пытается сохранить поток на стороне сервера, вы должны убедиться, что пользователь имеет право его разделить (вы не можете доверять безопасности клиента).

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

Второй вопрос: можем ли мы "доверять" (чтобы не создавать жесткий и длинный код, который снижает производительность) на вид клиента для очень тяжелого взлома?

Вот еще один пост, рассказывающий об этом виде взлома: (спящий режим и проверка коллекции) Вопрос безопасности: как защитить коллекции Hibernate, возвращаемые с клиента на сервер?

Ответ 1

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

Большинство вещей в любом случае довольно легко исправить:

  • Утилиты sql действительно не имеют никакого отношения к sql, это просто манипуляции с строкой, поэтому, если вам это не нравится, просто используйте подготовленные инструкции с привязанными параметрами и забудьте о проблеме.
  • межсайтовый эксплойт легко сбрасывается путем экранирования (с htmlentities или так) всех недоверенных данных перед отправкой в ​​качестве вывода - конечно, это должно сочетаться с обширной фильтрацией данных, но это хороший старт
  • кражи учетных данных: никогда не сохраняйте данные, которые могут обеспечить постоянный доступ к защищенным областям - вместо этого сохраните хешированную версию имени пользователя в файлах cookie и установите ограничение по времени для сеансов: таким образом, злоумышленник, который мог бы украсть этот данные будут иметь ограниченный доступ вместо постоянного.
  • никогда не предполагайте, что только потому, что пользователь зарегистрирован, тогда ему можно доверять - применять правила безопасности для всех
  • лечить все, что вы получаете извне, как потенциально опасное: даже надежный сайт, из которого вы получаете данные, может быть взломан, и вы тоже не хотите падать - даже ваша собственная база данных может быть скомпрометирована (особенно если вы в общей среде), поэтому не доверяйте его данным.

Конечно, есть больше, например, атаки на захват сеансов, но это первые вещи, на которые вы должны обратить внимание.

ИЗМЕНИТЬ относительно вашего редактирования:

Я не уверен, что полностью понимаю ваши примеры, особенно то, что вы подразумеваете под "доверием к безопасности клиентов". Конечно, все страницы с ограниченным доступом должны начинаться с проверки, чтобы узнать, имеет ли пользователь права на просмотр содержимого и, при необходимости, если он (или она) имеет правильный уровень привилегий: могут быть доступны некоторые действия для всех пользователей, а некоторые другие доступны только для более ограниченной группы (например, модераторы на форуме). Все эти элементы управления должны выполняться на стороне сервера, потому что вы никогда не сможете доверять тому, что клиент отправляет вам, будучи данными через GET, POST и даже COOKIES. Ни один из них не является обязательным.

Ответ 2

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

Общая безопасность в вашем приложении должна звучать независимо. Если у вас есть система управления пользователями, она должна выполнять свою работу должным образом. То есть пользователи, которые не должны получать доступ к чему-либо, не должны иметь к нему доступ.

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

Вкратце:

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

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


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

Могу ли я получить /forum/view_thread/12345/? Могу ли я отправить это сообщение $data в /forum/new_thread/, пожалуйста?
Могу ли я иметь /forum/admin/delete_all_users/?

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

Ответ 3

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

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

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

Неважно, да? Я имею в виду, кто заботится об учетной записи игрока на веб-сайте? Но большинство пользователей использовали один и тот же пользовательский пароль для MSN, Counter Strike и т.д. Так что очень скоро возникла большая проблема.

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

Ответ 4

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

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

Вы хотите иметь сильный ACL-интерфейс API. Несколько дней назад я видел проблему, когда парень защищал каждый пользовательский интерфейс, но сайт был уязвим через AJAX, только потому, что его API (где он отправлял запросы) просто доверял каждому отдельному запросу, который нужно проверить. Я мог бы в основном вытащить всю базу данных через эту ошибку.

Ответ 5

Я думаю, что полезно различать предотвращение ввода кода и авторизацию простых данных.

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

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

Таким образом, SQL-инъекция и XSS являются чисто техническими вопросами - на следующем уровне авторизация: насколько тщательно должен быть защищен доступ к данным, которые не являются бизнесом текущего пользователя. Здесь я думаю, что это действительно зависит от приложения, и я могу себе представить, что имеет смысл различать: "пользователь X может ничего не видеть от пользователя Y" против "Не беспокоить пользователя X с данными пользователя Y, улучшит удобство использования и сделает приложение более удобно использовать".