Действие преподавателя:
Демонстрирует слайды 2–14 презентации
prezentaciya.html, последовательно раскрывая архитектурные уровни контроля.
Прямая речь преподавателя:
«Обратите внимание на Слайд 3. Перед нами классическая двухуровневая модель. Запомните формулу: Frontend — это забота о пользователе (User Experience), а СУБД — это выживание и целостность базы данных (Data Integrity).
На клиенте мы стремимся дать реакцию за 0 миллисекунд. Как только пользователь вводит ИНН или телефон, скрипт на лету проверяет его регулярным выражением. Посмотрите на Слайд 4. Главное правило регулярных выражений: обязательное наличие граничных якорей — символа домика ^ (начало строки) и символа доллара $ (конец строки).
Если вы напишете просто /\d{10}/, валидатор сочтет корректной строку "грязь1234567890мусор", потому что внутри нее нашлись десять цифр! И только шаблон /^\d{10}$/ гарантирует, что вся строка состоит строго из десяти цифр.
Далее взгляните на Слайд 5. Для корпоративных систем мало проверить количество цифр. Например, 10-й знак ИНН юридического лица — это контрольный разряд, вычисляемый по сумме произведений первых 9 цифр на весовые коэффициенты. Если пользователь случайно перепутает две соседние цифры местами, контрольная сумма сразу выявит ошибку на клиенте еще до отправки запроса в сеть!
А теперь перейдем к вопросу безопасности — Слайды 6 и 7. Почему возникают SQL-инъекции? Потому что неграмотные программисты собирают запрос склеиванием строк. Если в поле логина передать кавычку с комментарием admin' --, то весь парольный фильтр запроса просто превратится в комментарий. Решение здесь только одно — Prepared Statements (параметризованные запросы).
При параметризации СУБД сначала компилирует структуру команды в абстрактное синтаксическое дерево (AST) с плейсхолдерами $1, $2, а затем принимает значения отдельно по бинарному протоколу. Что бы пользователь ни написал в параметре — хоть 10 кавычек и DROP TABLE — СУБД воспримет эти символы строго как литеральные текстовые данные. Структура запроса не может измениться физически!
Наконец, посмотрите на Слайды 11 и 12. Что происходит, если база данных всё-таки отвергла операцию? Например, клиент попытался зарегистрировать организацию с ИНН, который уже есть в базе. В СУБД сработает уникальное ограничение и ядро выбросит исключение с кодом SQLSTATE 23505 (unique_violation).
Что делает плохой разработчик? Выводит на экран пользователю сырую техническую ошибку: ERROR: duplicate key value violates unique constraint "clients_inn_key". Это двойной провал! Во-первых, рядовой бухгалтер не понимает, что такое "constraint" и "unique". Во-вторых, мы раскрыли потенциальному хакеру внутреннее имя таблицы и структуру индексов базы данных!
Профессиональный бэкенд применяет паттерн Error Mapping: драйвер перехватывает код 23505 и возвращает на форму понятную и вежливую фразу: "Клиент с данным ИНН уже зарегистрирован в системе. Проверьте правильность ввода или воспользуйтесь поиском"».
Реакция обучающихся:
Конспектируют схему Prepared Statements, структуру таблицы кодов SQLSTATE (класс 23 — integrity, класс 40 — transactions), задают вопросы по алгоритму вычисления контрольного разряда.