Салют, хабровчане! Подготовили для вас перевод полезного руководства в преддверии старта курса «C# ASP.NET Core разработчик».





С каждым обновлением .Net Core Microsoft доказывает тот факт, что .Net Core является самым мощным, универсальным и полным фреймворком, доступным для разработки мощных десктопных, мобильных, облачных и веб-приложений. В отличие от десктопного или мобильного приложения, веб-приложение работает по общедоступному адресу, что является одной из причин, по которым безопасность веб-приложения имеет огромную важность. Хотя Asp.Net Core разработан с учетом лучших практик безопасности, тем не менее, все же существуют некоторые уязвимости, за которыми мы должны следить до и после релиза нашего Asp.Net Core приложения.

В этой статье мы рассмотрим несколько пробелов в безопасности Asp.Net Core веб-приложений и их возможные решения. Давайте начнем с перечисления некоторых важных моментов для обеспечения безопасности нашего .Net Core приложения.

  1. Сделайте логин более безопасным
  2. Передавайте секретные данные только в зашифрованном виде
  3. Не забывайте чистить cookies при выходе
  4. Всегда используйте SSL
  5. Никогда не храните конфиденциальные данные в вашей базе данных в явном виде
  6. Аудиторские следы и логирование очень важны
  7. Никогда не показывайте оригинальные технические ошибки конечному пользователю
  8. Межсайтовый скриптинг (XSS)
  9. Старайтесь скрывать версию вашего .Net Core
  10. Межсайтовая подделка запроса (CSRF)
  11. LINQ может защитить от SQL инъекций
  12. Добавьте проверки во время десериализации
  13. Всегда следите за актуальными версиями ваших фреймворков и библиотек

1. Сделайте логин более безопасным


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


Вот несколько советов как защитить точку входа вашего приложения.

ИСПОЛЬЗУЙТЕ СЛОЖНЫЕ УЧЕТНЫЕ ДАННЫЕ

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

ЗАЩИТИТЕ СВОЙ ЛОГИН ОТ БРУТФОРСА

Брутфорс (Brute Force) является наиболее распространенным типом атак, который заключается в использовании различных алгоритмов перебора комбинаций юзернейма и пароля с целью угадать учетные данные для логина. Кроме того, большое количество попыток входа в систему может перегрузить ваш сервер, что может вылиться в DoS (Denial of service или “отказ в обслуживании”) и простоях для реальных пользователей вашего приложения.

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

Итак, как же защитить ваше Asp.Net приложение от брутфорс атак?

Вот несколько советов по предотвращению брутфорса:

  • Используйте Captcha на своей странице логина, потому что боты пока не могут справиться с капчей.
  • Временно блокируйте IP после нескольких неудачных попыток входа в систему.
  • Избегайте использования распространенных имен пользователей, таких как admin или user, потому что брутфорс алгоритмы обычно имеют базу данных распространенных учетных данных и пробуют их в первую очередь.
  • Сделайте ваш пароль сложным для подбора, а именно содержащим в себе буквы(A-Z и a-z), цифры(0-9) и специальные символы(!, @,., #, $,%, ^, &, * и т.д.).

Как реализовать вышеуказанные рекомендации?

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

ВСЕГДА ИСПОЛЬЗУЙТЕ .NET CORE IDENTITY

Asp.Net Core имеет множество встроенных библиотек и инструментов для защиты ваших приложений. Авторизация также имеет замечательную реализацию от Microsoft, которая предоставляет нам полную настройку входа в систему и регистрации в соответствии с лучшими практиками безопасности.

2. Передавайте секретные данные только в зашифрованном виде


Никогда не отправляйте свои конфиденциальные данные, такие как пароль или учетные данные кредитной карты, для проверки на сервер в явной форме. Хакеры могут украсть эти данные, перехватывая их перед отправкой на сервер.

Всегда используйте алгоритм хеширования, такой как md5 или SHA256, для паролей и алгоритмы шифрования, такие как AES или DES, на стороне клиента, например, используя jQuery.


3. Не забывайте чистить cookies при выходе


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

В то же время, cookie-файл AspNetCore.Session добавляется в браузер для ведения учета вошедшего в систему пользователя.



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

4. Всегда используйте SSL


SSL означает Secure Socket Layer. Он шифрует связь между клиентом и сервером с помощью очень сложного ключа.

Вы можете просто указать в Starup.cs вашего Asp.Net Core приложения всегда использовать безопасную политику для cookie-файлов.


5. Никогда не храните конфиденциальные данные в вашей базе данных в явном виде


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

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


6. Аудиторские следы и логирование очень важны


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

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



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


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

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



8. Межсайтовый скриптинг (XSS)


В XSS(Cross-Site Scripting)-атаках хакеры в целях кражи учетных данных пользователей и других важных данных засылают вредоносные скрипты через поля ввода.

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

Я нашел изображение ниже в статье о XSS на Cloudflare. Это поможет вам легче представить XSS.



Итак, как защитить наше Asp.Net Core приложение от атак с использованием межсайтовых скриптов?

Вы можете защитить свое веб-приложение, следуя этим советам:

  • Используйте регулярные выражения как на стороне клиента, так и на стороне сервера, и сохраняйте в своей базе данных только проверенные данные.
  • HTML-шифрование с помощью Razor помогает обрабатывать такие скрипты.
  • XXS также можно совершать с помощью URL-шифрования, поэтому проверяйте параметры URL-адреса и шифруйте их с помощью UrlEncoder.

Вот отличная статья от Microsoft про защиту вашего приложения от XSS.

9. Старайтесь скрывать версию вашего .Net Core


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

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

Вот как можно скрыть версию .Net Core:

  • Удалить X-Powered-By из заголовка ответа.
  • <a href="https://www.nuget.org/packages/NWebsec.AspNetCore.Middleware/">NWebsec.AspNetCore.Middleware

Установите AddServerHeader = false для удаления заголовка Server: Kestrel.

Вы можете удалить X-Powered-By, используя этот простой фрагмент кода в вашем web.config

<httpProtocol>
 <customHeaders>
   <remove name="X-Powered-By" />
 </customHeaders>
</httpProtocol>

10. Межсайтовая подделка запроса (CSRF)


Знаете ли вы назначение атрибута [ValidateAntiForgeryToken] в ваших .Net Core Web API-интерфейсах? Возможно, вы также замечали код asp-antiforgery="true" в ваш cshtml файле?

Сначала нужно разобраться с CSRF (Cross-Site Request Forgery или XSRF), затем мы попытаемся понять цель вышеуказанного тега и атрибута.

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

Изображение ниже наглядно демонстрирует CSRF.



Как же защитить ваше приложение от CSRF?

asp-antiforgery="true" создает токен защиты от подделки, а [ValidateAntiForgeryToken] проверяет на стороне сервера, действителен ли токен, и защищает вас от межсайтовой подделки запросов.

11. LINQ может защитить от SQL инъекций


SQL инъекции — один из наиболее часто используемых приемов, наносящих вред данным пользователей за многие годы.

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

Вот наглядный пример, что такое SQL инъекция.


Как обезопасить ваше Asp.Net Core приложение от SQL инъекций?

Вот несколько советов:

  • Используйте Entity Framework Core
  • Всегда используйте параметризованные запросы.
  • Всегда проверяйте ввод на стороне сервера.
  • Используйте хранимые процедуры.

12. Добавьте проверки во время десериализации


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


Таким образом, мы открыты для множества вредных потоков.

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

13. Всегда следите за актуальными версиями ваших фреймворков и библиотек


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

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


ЗАКЛЮЧЕНИЕ


Ничто не бывает на 100% безопасным, но мы должны сделать наше приложение максимально безопасным, следуя лучшим практикам. Хотя .Net Core считается одной из самых безопасных платформ, мы все же должны следить за действиями в нашем приложении и принимать быстрые меры в случае любой вредоносной активности.

Спасибо за чтение моей статьи, надеюсь, она мотивирует вас подумать о повышении безопасности вашего Asp.Net Core приложения.

Я буду рад, если вы захотите оставить свой отзыв в разделе комментариев ниже.

Вот еще несколько статей, которые могут вас заинтересовать:




Узнать подробнее о курсе



Читать ещё: