EduSensei & Lurk
Lurk Lurk
Привет, ЭдуСенсей, вот что я думал: как нам лучше организовать обучение безопасному кодированию? Может, начнем с самых распространенных ошибок в веб-приложениях и разберем, как их исправить? Как тебе такая идея?
EduSensei EduSensei
Звучит как отличный план! Давай разделим это на понятные этапы: 1) Проверка и очистка входных данных, 2) Аутентификация и управление паролями, 3) Безопасность сессий и куки, 4) Обработка ошибок и логирование, и 5) Безопасная развертка (обновления, принцип наименьших привилегий). Для каждого этапа мы перечислим типичные ошибки, объясним, почему они опасны, и дадим практические примеры кода и стратегии тестирования. Завершим все небольшим тестом для закрепления материала. Готова начинать?
Lurk Lurk
Звучит хорошо. Начнём с проверки и очистки входных данных, но без лишней воды – эффективно и по делу. Важно соблюдать стиль. Давай начнём с проверки и очистки данных, но объяснения короткие, примеры – конкретные. Отлично, я напишу первый модуль. Будем лаконичны: коротко о подводных камнях, почему они важны, и пару примеров чистого кода. Я готов к следующему этапу.
EduSensei EduSensei
Отлично! Вот краткий план для первого модуля: 1. **Распространенная ошибка:** Принимать данные без проверки. * *Почему это важно:* Может привести к атакам типа инъекции, XSS или повреждению данных. 2. **Решение:** - Определять строгие типы данных (int, string, enum). - Использовать проверку по белому списку: разрешать только ожидаемые шаблоны. - Экранировать вывод при отображении в HTML. 3. **Пример чистого кода (Python + Flask):** ```python from flask import request, abort import re def safe_int(value): if re.fullmatch(r"\d+", value): return int(value) abort(400, "Invalid number") def safe_string(value): if re.fullmatch(r"[A-Za-z0-9_-]{1,50}", value): return value abort(400, "Invalid string") ``` 4. **Совет по тестированию:** Пишите модульные тесты, которые передают вредоносные данные и проверяют, что валидация их отклоняет. Скажи, если хочешь что-то изменить или если мы готовы переходить к аутентификации.
Lurk Lurk
Выглядит неплохо, только небольшая поправка: может, стоит добавить пару слов о том, почему выбран именно этот шаблон регулярного выражения? В остальном можно переходить к аутентификации. Сохраним темп.
EduSensei EduSensei
Конечно, вот как нужно поправить: ```python def safe_string(value): # Разрешены только буквы, цифры, подчеркивание и дефис, до 50 символов # Это предотвращает внедрение и ограничивает размер для хранения if re.fullmatch(r"[A-Za-z0-9_-]{1,50}", value): return value abort(400, "Invalid string") ``` Теперь можно переходить к модулю аутентификации. Давайте постараемся сделать его структурированным и эффективным.
Lurk Lurk
Понял. Следующий пункт: аутентификация и работа с паролями. Обсудим слабые пароли, хранение в открытом виде, неправильное использование соли и блокировку после неудачных попыток. Потом покажу пример на Flask с bcrypt, объясню, как всё работает, и предложу идею для быстрого теста. Погружаемся.