Безопасность базы данных: Посредник "to_be_deleted" столбец / таблица? - PullRequest
0 голосов
/ 19 сентября 2008

Каждый случайно забыл предложение WHERE в запросе DELETE и один или два раза обработал некоторые данные без резервного копирования. Я размышлял над этой проблемой, и мне было интересно, является ли решение, которое я нашел, практичным.

Что, если вместо реальных DELETE запросов сценарии приложения и обслуживания выполняли что-то вроде:

UPDATE foo SET to_be_deleted=1 WHERE blah = 50;

А потом задание cron было выполнено и фактически удалено все с флагом? Недостатком было бы то, что почти к каждому другому запросу нужно было бы добавить WHERE to_be_deleted != 1, но с другой стороны, вы никогда больше не ошибочно потеряете данные. Вы могли видеть «затронуто 2 349 325 строк» ​​и сказать: «Хм, похоже, я забыл предложение WHERE» и сбросить флаги. Вы даже можете сделать поле to_be_deleted столбцом DATE, чтобы задание cron проверило, пришло ли время строки.

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

Итак, мой вопрос: это хорошая идея или есть подводные камни, которых я не вижу?

Ответы [ 14 ]

0 голосов
/ 19 сентября 2008

"ГДЕ to_be_deleted <> 1" в каждом другом запросе является огромным. Другой способ - после того, как вы запустили свой случайно мошеннический запрос, как вы определите, какие из 2 349 325 ранее были помечены как удаленные?

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

0 голосов
/ 19 сентября 2008

Вы также получаете функцию «мягкого удаления», так что вы можете дать (определенным) конечным пользователям возможность «отменить» - в миксе должен быть довольно сильный недостаток, чтобы отменить преимущества мягкого удаления.

0 голосов
/ 19 сентября 2008

Чтобы избежать предложения to_be_deleted WHERE, вы можете создать триггер до того, как сработает команда delete, чтобы вставить удаленные строки в отдельную таблицу. Эта таблица может быть очищена, когда вы уверены, что все в ней действительно необходимо удалить, или вы можете хранить ее в архиве.

0 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...