Поучаствуйте в дискусии про безопасность работы с БД

dimitrius

Новичок
Забугорный разработчик высмеивает меня неопытного по следующему вопросу:
Я реализовал класс переходник для работы с несколькими разными БД одновременно, и в нем зашил строгую проверку по стандартным функциям насчет возможных инъекций и прочих не валидных данных. Но для фантазии пользователей класса оставил небезопасную функцию в которой можно отправлять все, что угодно - если кому не подойдут стандартные функции класса. Вышел большой интерфейс.
"Коллега" утверждает, что в ДБ хендлере не должно быть никаких проверок данных, а за безопасность должен отвечать пользователь класса, и нужно максимально упростить интерфейс. Ваше мнение? Где больше правды? Класс для работы в cms интернет магазина.
 

Фанат

oncle terrible
Команда форума
Все эти проверки на инъекции - это полная, беспросветная, кромешная ерунда. А самый жыр - это функция для их обхода.
за безопасность должен отвечать пользователь класса
Тоже дурак.

Класс должен позволять передавать любую динамику в запрос только через плейсхолдеры. Данные для которых должны соответственным образом форматироваться. И вот это самое форматирование плейсхолдеров и должно заниматься безопасностью.

А единственная забота о безопасности, которая лежит на пользователе - это использовать плейсхолдеры, а не подставлять данные напрямую. ВСЁ.
 

dimitrius

Новичок
Все эти проверки на инъекции - это полная, беспросветная, кромешная ерунда.
Инъекци, минимально необх. объем данных, валидность и проч - мне сдается важно.
А самый жыр - это функция для их обхода.
с позиции взломщика? или что вы имели в виду.
Класс должен позволять передавать любую динамику в запрос только через плейсхолдеры
если вы об этом http://habrahabr.ru/post/148701/, то я реализовал чуть по другому, чем-то напоминает передачу данных в смарти.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
С позиции дискуссии. Само её наличие говорит о том, что, во-первых, все эти проверки и валидации - ФУФЛО, а во-вторых, никто, при наличии обходной функции, ими пользоваться не будет.

Что имеется в виду под "инъекциями"? Что имеется в виду под "валидностью"?
я реализовал чуть по другому
Ради бога.
Главное, что для защиты от инъекций этого достаточно.
И ничего больше, никаких проверок "на возможные инъекции" не нужно.
Запрос, в котором корректно отформатированы все динамические литералы, неуязвим для инъекций. По определению.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Какие ещё "доп инструкции"? инструкции кому?

Решать, что должно идти в базу - маленький абзац или война и мир, должно приложение. Только оно знает, какой размер будет подходящим. А драйверу дазы банных на это должно быть начхать - это не его ума дело. Его дело - подай-принеси. Что скажут.
Судя по всему, именно это тебе и пытался втолковать старший коллега, но безуспешно
 

Фанат

oncle terrible
Команда форума
Смотри, война и мир - это валидация пользовательского ввода. Даже название говорит о том, что к базам данных эта операция отношения не имеет. Отвалидированные данные могут пойти в файл, в какой-нибудь удаленный сервис, к пользователю вернуться. Совсем не обязательно в датабазу.
Поэтому валидацией должен заниматься отдельный класс, никак не связанный БД.
Я не оспариваю необходимость такой валидации. просто в классе для работы с БД ей делать нечего.
 
Последнее редактирование:

dimitrius

Новичок
Судя по всему, именно это тебе и пытался втолковать старший коллега, но безуспешно
и это в том числе. Не совсем безуспешно, я сюда не за поддержкой своей стороны обратился, а услышать еще мнение. Каждый класс(ядро цмс) делает запрос к БД, я реализовал зависимость шаблона запроса и соответственную проверку данных исходя из какого класса идет вызов. Цель написать универсальный класс не стояла, класс содержит список шаблонных забросов в которые и вставляются переданные переменные, которые прошли предварительную проверку.
 

Фанат

oncle terrible
Команда форума
Понятно. Типичный синдром write-only, осложнённый туннельным зрением.
"Я написал супер-гениальный класс, который все за меня делать будет, одним пальцем. Теперь вообще код писать не нужно будет - только вызывать методы класса"
 

Фанат

oncle terrible
Команда форума
В общем, надо понять, что ты там наваял.
Если модель, то проверки в ней очень даже приветствуются.
Но если "дб хендлер" - то проверки там могут быть только на соответствие данных базовым типам. К примеру, чтобы не прошла строка там, где ожидается число. Или строка там, где ожидается массив.
 

dimitrius

Новичок
Понятно. Типичный синдром write-only, осложнённый туннельным зрением.
"Я написал супер-гениальный класс, который все за меня делать будет, одним пальцем. Теперь вообще код писать не нужно будет - только вызывать методы класса"
))) да где то так. И он не в модели. Думаю вы правы. Если расширять модель, то надо будет изменять и класс. Хотя хотел как лучше, красиво. Но перепишу
К примеру, чтобы не прошла строка там, где ожидается число.
с ваших же слов это должна делать модель, так как откуда, хендлеру понимать, что должно пройти.
 

Фанат

oncle terrible
Команда форума
В общем, то, что ты описываешь - это такой гибрид модели с дб хендлером.
Просто раздели их функционально.
Код, в котором прописаны запросы - это модель. Он и валидации должен проводить.
А в дб хендлере никаких запросов и валидаций - только форматирование.
 
Сверху