katlog.orgжурнал разработки Демо-каталогДемо
ОШ002
Разбор ошибки2 мин чтения

Ошибка 415: почему не удалялась запись

Библиотекарь создал запись по ISBN, попробовал её удалить — и получил «HTTP 415: Ожидается JSON». Разбираем, как защитное правило сломало удаление и почему исправлять нужно правило, а не исключение.

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

Окно «Удалить запись?» с красной надписью HTTP 415: Ожидается JSON
Первый шаг двойного подтверждения. Кнопка «Продолжить» есть, а удаления — нет.

Что увидел библиотекарь

Запись «Flucht – Vertreibung – Neuanfang» создана через новую функцию поиска описания по ISBN. Всё подтянулось правильно. Затем — удаление с двойным подтверждением: первое окно, кнопка «Продолжить к подтверждению» и красная строка внизу: HTTP 415 : Ожидается JSON.

Что произошло на самом деле

Незадолго до этого сервер получил дополнительную защиту. Одно из правил звучало разумно: каждый запрос, который что-то меняет, должен приходить в формате JSON. Это закрывает целый класс атак, когда чужой сайт пытается отправить форму от имени вошедшего пользователя.

Но у некоторых действий вообще нет данных. Удаление записи отправляет только «удалить запись № …» — без тела запроса. Для таких случаев в правиле был список исключений: выход из системы, удаление пользователя, загрузка логотипа. Удаление записи в список не попало.

Корень проблемыПравило проверяло не «правильный ли формат у данных», а «есть ли вообще данные в формате JSON». Запрос без данных для него выглядел как нарушение.

Почему не надо просто добавить исключение

Самое быстрое исправление — дописать удаление записи в список. Но это чинит симптом. Такие же запросы без данных есть у восстановления из корзины, окончательного удаления, «Снять бронь», «Вернуть на полку». Каждое новое действие становилось бы новой ловушкой.

Правильное исправление — изменить само правило: требовать JSON только тогда, когда запрос действительно передаёт данные. Защиту это не ослабляет: запросы без данных по-прежнему проверяются по источнику и по защитному коду, который знает только открытая вкладка самого сайта.

Что мы попросили сделать

  1. Изменить правило в общем видеJSON обязателен, только если у запроса есть тело. Список исключений больше не нужен.
  2. Пройти по всем изменяющим действиямУдаление, корзина, заказы, продления, пароли, импорт, поля — для каждого автоматический тест.
  3. Проверить рукамиСоздать тестовую запись, удалить, найти в корзине, восстановить, удалить снова.

Урок

Защитные правила тоже нужно тестировать на реальных действиях пользователя, а не только на атаках. Ошибку нашёл не тест, а библиотекарь, который просто работал с системой. Поэтому в Katlog мы и тестируем на живых сценариях: создать, удалить, восстановить.

Эпилог

После исправления та самая запись «Flucht – Vertreibung – Neuanfang» удалилась без единой ошибки и теперь лежит в корзине: её можно восстановить в течение 30 дней. Проверка на живом сайте закрыла историю, которая с него и началась.