
Подробно рассмотрены все аспекты безопасности от теории до реальных реализаций .NET-приложений на языке C#. Рассказано, как обеспечивать безопасную регистрацию, авторизацию и поддержку сессий пользователей. Перечислены уязвимости, которые могут быть присущи веб-сайтам и Web API, описано, как хакеры могут эксплуатировать уязвимости и как можно обеспечить безопасность приложений. Даны основы оптимизации кода для обработки максимального количества пользователей с целью экономии ресурсов серверов и денег на хостинг. Рассмотрены сетевые функции: проверка соединения, отслеживание запроса, доступ к микросервисам, работа с сокетами и др. Приведены реальные примеры атак хакеров и способы защиты от них. Во втором издании добавлены новые примеры безопасности, рассмотрены вопросы реализации технологий OAuth2 и Single Sign On.
Для веб-программистов, администраторов и специалистов по безопасности
- Теория безопасности кода
- Проблемы авторизации
- Безопасность веб-приложений на реальных примерах
- Оптимизация кода
- Защита Web API
- Сетевые функции
- Реальные примеры атак хакеров и защиты от них
- Проблемы и реализация OAuth2 и Single Sign On
Книгу “C# глазами хакера. 2-е изд.“.
Предисловие…………………………………………………………………………………………….. 7
Об авторе………………………………………………………………………………………………………………………………………. 7
О книге…………………………………………………………………………………………………………………………………………… 8
Благодарности……………………………………………………………………………………………………………………………… 8
Глава 1. Теория безопасности………………………………………………………………… 10
1.1. Комплексная защита…………………………………………………………………………………………………………… 11
1.2. Сдвиг влево………………………………………………………………………………………………………………………….. 14
1.2.1. Обучение………………………………………………………………………………………………………………………… 15
1.2.2. Сбор требований…………………………………………………………………………………………………………… 16
1.2.3. Безопасность на этапе разработки……………………………………………………………………………… 16
1.2.4. Внешние компоненты……………………………………………………………………………………………………. 17
1.2.5. Статические анализаторы кода…………………………………………………………………………………… 17
1.2.6. Динамический анализатор кода………………………………………………………………………………….. 18
1.2.7. Испытание на проникновение……………………………………………………………………………………… 18
1.2.8. Отчеты……………………………………………………………………………………………………………………………. 18
1.3. Проект OWASP…………………………………………………………………………………………………………………….. 19
1.4. Отказ в обслуживании………………………………………………………………………………………………………… 20
1.5. Управление кодом………………………………………………………………………………………………………………. 22
1.6. Стабильность кода: нулевые исключения………………………………………………………………………… 24
1.7. Исключительные ситуации………………………………………………………………………………………………… 26
1.8. Журналы ошибок и аудит………………………………………………………………………………………………….. 27
1.9. Ошибки нужно исправлять…………………………………………………………………………………………………. 29
1.10. Отгружаем легко и часто………………………………………………………………………………………………….. 35
1.10.1. Обновление базы данных…………………………………………………………………………………………… 37
1.10.2. Копирование файлов………………………………………………………………………………………………….. 38
1.10.3. Распределенное окружение……………………………………………………………………………………….. 39
1.11. Шифрование трафика……………………………………………………………………………………………………….. 40
1.12. POST или GET?………………………………………………………………………………………………………………….. 42
1.13. Ограничение времени выполнения………………………………………………………………………………….. 45
1.14. Кто проверяет данные?…………………………………………………………………………………………………….. 46
Глава 2. Аутентификация и авторизация……………………………………………….. 47
2.1. Шаблон приложения…………………………………………………………………………………………………………… 47
2.2. Регистрация пользователей……………………………………………………………………………………………….. 50
2.3. Форма регистрации…………………………………………………………………………………………………………….. 51
2.3.1. Корректные данные регистрации………………………………………………………………………………… 53
2.3.2. Email с плюсом и точкой………………………………………………………………………………………………. 57
2.4. Хранение паролей………………………………………………………………………………………………………………. 58
2.4.1. Хеширование…………………………………………………………………………………………………………………. 59
2.4.2. MD5-хеширование………………………………………………………………………………………………………… 60
2.4.3. Безопасное хеширование……………………………………………………………………………………………… 64
2.4.4. И еще немного о безопасности…………………………………………………………………………………….. 64
2.5. Создание посетителей………………………………………………………………………………………………………… 65
2.6. Captcha………………………………………………………………………………………………………………………………… 66
2.6.1. Настраиваем Google reCAPTCHA……………………………………………………………………………….. 67
2.6.2. Пример использования reCAPTCHA……………………………………………………………………………. 69
2.6.3. Отменяем капчу…………………………………………………………………………………………………………….. 72
2.7. Аутентификация………………………………………………………………………………………………………………….. 73
2.7.1. Базовая аутентификация………………………………………………………………………………………………. 73
2.7.2. Журналирование и защита от перебора…………………………………………………………………….. 75
2.7.3. Защищаемся от перебора…………………………………………………………………………………………….. 76
2.8. Запомни меня………………………………………………………………………………………………………………………. 79
2.8.1. Зашифрованный якорь………………………………………………………………………………………………….. 80
2.8.2. Опасность HttpOnly………………………………………………………………………………………………………. 83
2.8.3. Уникальные токены………………………………………………………………………………………………………. 84
2.9. Автозаполнение…………………………………………………………………………………………………………………… 87
2.10. Авторизация………………………………………………………………………………………………………………………. 87
2.11. Железобетонная проверка……………………………………………………………………………………………….. 92
2.12. Протокол OAuth………………………………………………………………………………………………………………… 93
2.12.1. Конфигурирование приложения «Яндекс» OAuth……………………………………………………. 95
2.12.2. Создаем клиента…………………………………………………………………………………………………………. 99
2.12.3. Что дальше?………………………………………………………………………………………………………………. 103
2.13. Делим авторизацию………………………………………………………………………………………………………… 103
2.14. Защита сессии…………………………………………………………………………………………………………………. 104
2.15. Многоуровневая авторизация……………………………………………………………………………………….. 105
2.16. Microsoft Identity…………………………………………………………………………………………………………….. 107
Глава 3. Безопасность .NET-приложений……………………………………………… 111
3.1. Инъекция SQL: основы……………………………………………………………………………………………………… 111
3.1.1. SQL-уязвимость в ADO.NET……………………………………………………………………………………….. 112
3.1.2. Защита от SQL-инъекции……………………………………………………………………………………………. 115
3.2. Dapper ORM………………………………………………………………………………………………………………………. 118
3.3. Entity Framework……………………………………………………………………………………………………………….. 122
3.4. Отправка электронной почты………………………………………………………………………………………….. 126
3.4.1. Очереди сообщений……………………………………………………………………………………………………. 127
3.4.2. Работа с очередью………………………………………………………………………………………………………. 129
3.4.3. Отправляем письма…………………………………………………………………………………………………….. 131
3.5. Подделка параметров………………………………………………………………………………………………………. 133
3.6. Флуд…………………………………………………………………………………………………………………………………… 140
3.7. XSS: межсайтовый скриптинг………………………………………………………………………………………….. 142
3.7.1. Защита от XSS в .NET…………………………………………………………………………………………………. 143
3.7.2. Примеры эксплуатации XSS………………………………………………………………………………………. 146
3.7.3. Типы XSS……………………………………………………………………………………………………………………… 148
3.7.4. Хранимая XSS……………………………………………………………………………………………………………… 149
3.7.5. XSS: текст внутри тега………………………………………………………………………………………………… 155
3.7.6. Скрипты……………………………………………………………………………………………………………………….. 157
3.7.7. Атака через промежуточный слой…………………………………………………………………………….. 158
3.7.8. HTML-расширения……………………………………………………………………………………………………… 159
3.7.9. Вывод из контроллера………………………………………………………………………………………………… 160
3.7.10. Эксплуатация XSS-уязвимости………………………………………………………………………………… 161
3.8. Политика безопасности контента……………………………………………………………………………………. 161
3.8.1. CORS на страже контента………………………………………………………………………………………….. 162
3.8.2. Источники загрузки…………………………………………………………………………………………………….. 162
3.8.3. Тестирование политики……………………………………………………………………………………………… 165
3.8.4. Разрешенные источники…………………………………………………………………………………………….. 168
3.9. SQL Injection: доступ к недоступному……………………………………………………………………………. 170
3.10. CSRF: межсайтовая подделка запроса…………………………………………………………………………. 172
3.11. Загрузка файлов……………………………………………………………………………………………………………… 177
3.12. Переадресация………………………………………………………………………………………………………………… 179
3.13. Защита от DoS…………………………………………………………………………………………………………………. 183
3.14. Кликджекинг……………………………………………………………………………………………………………………. 186
Глава 4. О производительности в целом……………………………………………….. 191
4.1. Основы……………………………………………………………………………………………………………………………….. 191
4.2. Когда нужно оптимизировать?………………………………………………………………………………………… 193
4.3. Оптимизация и рефакторинг…………………………………………………………………………………………….. 194
4.4. Отображение данных……………………………………………………………………………………………………….. 195
4.5. Асинхронное выполнение запросов………………………………………………………………………………… 198
4.6. Параллельное выполнение………………………………………………………………………………………………. 199
4.7. LINQ…………………………………………………………………………………………………………………………………… 200
4.8. Обновление .NET………………………………………………………………………………………………………………. 202
Глава 5. Производительность в .NET……………………………………………………. 203
5.1. Типы данных……………………………………………………………………………………………………………………… 203
5.1.1. Производительность…………………………………………………………………………………………………… 203
5.1.2. Отличие структур от классов…………………………………………………………………………………….. 205
5.1.3. Ссылки на структуры…………………………………………………………………………………………………. 210
5.2. Виртуальные методы……………………………………………………………………………………………………….. 212
5.3. Управление памятью………………………………………………………………………………………………………… 214
5.4. Закрытие соединений с базой данных……………………………………………………………………………. 217
5.5. Циклы…………………………………………………………………………………………………………………………………. 220
5.6. Строки………………………………………………………………………………………………………………………………… 221
5.7. Исключительные ситуации………………………………………………………………………………………………. 223
5.8. Странный HttpClient…………………………………………………………………………………………………………. 224
5.9. Класс ArrayPool………………………………………………………………………………………………………………… 226
5.10. Параметризованные запросы к БД……………………………………………………………………………….. 228
Глава 6. Сеть………………………………………………………………………………………… 230
6.1. Проверка соединения……………………………………………………………………………………………………….. 230
6.2. Отслеживание запроса……………………………………………………………………………………………………… 231
6.3. Класс HTTP-клиент…………………………………………………………………………………………………………… 234
6.4. Класс Uri……………………………………………………………………………………………………………………………. 235
6.5. Уровень розетки………………………………………………………………………………………………………………… 237
6.5.1. Сервер………………………………………………………………………………………………………………………….. 237
6.5.2. Клиент………………………………………………………………………………………………………………………….. 241
6.6. Доменная система имен……………………………………………………………………………………………………. 243
Глава 7. Web API………………………………………………………………………………….. 245
7.1. Пример Web API………………………………………………………………………………………………………………… 245
7.2. JWT-токены……………………………………………………………………………………………………………………….. 246
7.3. Устройство токенов………………………………………………………………………………………………………….. 253
7.4. Авторизация API……………………………………………………………………………………………………………….. 256
7.5. XSS и Web API…………………………………………………………………………………………………………………… 257
Глава 8. Трюки…………………………………………………………………………………….. 260
8.1. Кеширование…………………………………………………………………………………………………………………….. 260
8.1.1. Кеширование результата…………………………………………………………………………………………… 260
8.1.2. Кеширование статичными переменными…………………………………………………………………. 264
8.1.3. Кеширование уровня запроса……………………………………………………………………………………. 265
8.1.4. Кеширование в памяти……………………………………………………………………………………………….. 266
8.1.5. Сервер кеширования…………………………………………………………………………………………………… 268
8.1.6. Cookie в качестве кеша……………………………………………………………………………………………….. 269
8.2. Сессии………………………………………………………………………………………………………………………………… 271
8.2.1. Пишем свою сессию……………………………………………………………………………………………………. 271
8.2.2. Безопасность сессии…………………………………………………………………………………………………… 274
8.2.3. Сессия в качестве кеша………………………………………………………………………………………………. 275
8.2.4. Уничтожение сессии…………………………………………………………………………………………………… 277
8.2.5. Выход…………………………………………………………………………………………………………………………… 277
8.2.6. Кукушка для сессии……………………………………………………………………………………………………. 278
8.2.7. Преимущества и недостатки………………………………………………………………………………………. 279
8.3. Защита от множественной обработки…………………………………………………………………………….. 280
Заключение………………………………………………………………………………………….. 284
Литература…………………………………………………………………………………………… 285
Приложение. Описание файлового архива, сопровождающего книгу….. 286
Предметный указатель…………………………………………………………………………. 287
