Подтвердить что ты не робот

Контрольный список безопасности ASP.NET MVC

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

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

(ОБНОВЛЕНИЕ: меня больше интересует контрольный список Blackbox - "перейдите на страницу, попробуйте что-то подобное", но может быть интересен контрольный список whitebox.)


Здесь что-то я придумал до сих пор:

Контрольный список безопасности Blackbox

  • Отправить неверные/вредоносные данные ( примеры здесь < ), чтобы убедиться, что входные данные проверяются на тип, длину, формат и диапазон на javascript.
  • Отключите проверку на стороне клиента и повторите шаг выше, чтобы убедиться, что
    • вы не только проверяете с помощью javascript, но и проверяете на стороне сервера.
    • на сервере проверяется тип, длина, формат и диапазон
    • ввод свободной формы дезинфицирован
    • который включает вход, кодируется с помощью HtmlEncode и UrlEncode
  • Вставляйте чрезвычайно большой объем данных в строку запроса в соответствии с http://www.example.com/foo?bar=HugeAmountOfData, чтобы убедиться, что вы ограничиваете входные данные и выполняете пограничные проверки.
  • Посетите POST-действие через GET, чтобы убедиться, что действия "отправить форму" ограничены только POST-адресом.
  • Если это применимо, загрузите файл с неправильным размером/форматом (огромный файл, пустой файл, исполняемый файл с переименованным расширением и т.д.), чтобы убедиться, что закачки обработаны изящно.
  • (как проверить из UI?) убедитесь, что для навигации используются абсолютные URL.
  • Получите доступ к URL-адресу как пользователю без правильных разрешений, чтобы убедиться, что разрешения явно протестированы с помощью атрибутов action/controller.
  • Получите доступ к URL-адресу, предоставляющему несуществующие данные (например, к отсутствующим идентификаторам продуктов, элементам, к которым у вас нет доступа и т.д.), чтобы убедиться, что верна правильная ошибка (404 или 403 и т.д.).
  • Доступ к конфиденциальной странице через HTTP, чтобы убедиться, что она доступна только через HTTPS.

Контрольный список безопасности Whitebox

Веб-уровень.

  • В режиме отладки сломайте код так, чтобы он выдавал исключение, чтобы убедиться, что он не работает надежно. Удостоверьтесь, что вы обнаруживаете исключения и записываете подробные сообщения, но не отправляете информацию клиенту.
  • Если это применимо, убедитесь, что действия MVC ограничены только POST/GET, особой ролью пользователя, чем-либо еще?.
  • Убедитесь, что действия POST сопровождаются атрибутом [ValidateAntiForgeryToken] для предотвращения атак типа Cross-Site Request Forgery.
  • Убедитесь, что Response.Write (прямо или косвенно) никогда не используется для отображения пользовательского ввода.
  • Убедитесь, что конфиденциальные данные не передаются в строках запроса или в поля формы.
  • Убедитесь, что ваши решения по безопасности не зависят от информации заголовков HTTP.

Уровень обслуживания.

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

Уровень базы данных.

  • Убедитесь, что извлеченные сохраненные procs не используют SELECT *, но всегда явно указывают список столбцов.
  • Убедитесь, что обновленные/удаленные хранимые процедуры работают в транзакции (через @@TRANCOUNT и т.д.) и явно фиксируют/откатывают ее.

Комментарии? Поправки? Отсутствующие шаги?

Сделав его вики-сообществом, не стесняйтесь редактировать столько, сколько захотите.

4b9b3361

Ответ 1

Чтобы добавить к списку:

Black: DoS-атаки - используйте tinyget или аналогичный для имитации DoS-атак, посмотрите, что делает ваше приложение.

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

Белый: использование файлов cookie для конфиденциальной информации? См. Файлы cookie не используются для конфиденциальных данных и не сохраняются локально в течение заданного интервала. Черный: Sniff в папке IE IE/XYZ для файлов cookie.

Black: Опять же, используйте скриптовый tinyget или попробуйте вручную, чтобы узнать, будет ли угадывать пароль грубой силы, или если у приложения есть умные задержки/опровержения для атак с удержанием пароля.

Черный: выполните любую из атак и посмотрите, будет ли администратор автоматически уведомлен об атаке, или это только тот, кто знает об этом.

"Убедитесь, что ваши решения по безопасности не зависят от информации заголовков HTTP" - http-заголовки используются для аутентификации ntml/kerberos? Может быть, просто не используйте их глупо, не изобретайте или не полагайтесь на реферера и т.д.

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

Ответ 2

Придерживаясь главным образом специфическим для MVC материала:

  • В ASP.NET 4 понимайте <%: и MvcHtmlString.
  • Используйте HTML-помощники, когда это возможно, вместо необработанного HTML, поскольку это увеличивает вероятность того, что вы забудете кодировать (помощники делают это за вас)
  • Проанализируйте все виды использования JsonRequestBehavior.AllowGet, чтобы гарантировать, что он не сможет вернуть массив.
  • Не изобретайте все, что связано с безопасностью. Используйте проверенные, поддерживаемые, готовые реализации.
  • Не утечка информации о безопасности в robots.txt

Ответ 3

  • Пользовательские учетные данные проверяются на каждый запрос, либо GET, либо POST или другой, для подтверждения аутентификации пользователя.

  • Проверить авторизацию пользователя (после проверки подлинности) для каждой чувствительной операции

  • Остерегайтесь выходного кэширования, особенно если вы реализуете свою собственную систему членства

Ответ 4

Убедитесь, что вы не слепо связываете данные формы с вашей моделью, всегда используя TryUpdateModel<T> over TryUpdateModel.