[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Где чистить данные
Страницы: 1, 2
Эли4ка
Добрые день. Вот задумалась, я сейчас чищу данные так:
Контроллер занимается экранированием, чистит html теги, устраняет возможность инъекции, борется с приходящими массивами, вместо ожидаемого одного значения, а в модели уже данные приводятся к ожидаемому варианту записи.
Думаю а правильно ли это?
Вот есть три возможных варианта:
a) Controller вызывает только Model и Model обрабатывающие данные $_POST .
б) Controller преобразует данные $_POST в переменные и передает их в Model .
c) Controller преобразует данные $_POST в объект домена Model и передает объект только Model
Как же лучше сделать?
Kusss
а) однозначно.
Я за "тонкие" контроллеры
twin
Цитата (Kusss @ 8.04.2019 - 13:07)
а) однозначно.
Я за "тонкие" контроллеры

А если данные не только из POST могут придти? Допустим можно же приложение запустить из консоли.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Zzepish
twin
Это не противоречит его логике, тут ,скорей всего, вопрос к Эле
Эли4ка
Приложение из консоли не будет работать(пока что)
Данные типа POST.
GET данных нет никаких.
COOKIE знаю, что подделать можно, но стоит ли контроллеру или модели ими заниматься вообще?
Valick
Цитата (Эли4ка @ 8.04.2019 - 16:59)
GET данных нет никаких.

Ставим крест на REST? smile.gif


_____________
Стимулятор ~yoomoney - 41001303250491
vagrand
Эли4ка
Цитата
Контроллер занимается экранированием, чистит html теги, устраняет возможность инъекции


1. Экранирование и защита от SQL инъекций это по сути своей одно и тоже и этим должна заниматься базовая модель, от которой наследуются модели конкретных сущностей. Плюс, модель не должна напрямую работать с глобальными массивами вроде $_POST или $_GET. Контроллер должен ей передавать данные, а откуда уж они будут взяты, это решать ему.

2. Зачем нужно чистить html тэги при получении данных от пользователя? И что вообще значит "чистить"? Можно сделать strip_tags(), а можно htmlspecialchars() и это будут суть разные действия. В любом случае, при записи в БД я бы не рекомендовал делать ни того, ни другого. Эти манипуляции нужно делать только при выводе или отдаче клиенту через API.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
twin
Цитата (Zzepish @ 8.04.2019 - 13:42)
twin
Это не противоречит его логике, тут ,скорей всего, вопрос к Эле

Противоречит. В модель должны передаваться данные. "Чистить" их должна модель. Имеется ввиду валидация и может быть какая то фильтрация. Но модель ничего не должна знать, откуда взялись данные. Из POST, ШМОСТ или из под кровати.

Принять данные и передать их в модель - дело контроллера. Не настолько он должен быть тонким. Так что ответ скорее "б". smile.gif

vagrand ответил более развернуто.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Эли4ка
Цитата (Valick @ 8.04.2019 - 17:24)
Ставим крест на REST? smile.gif

Так если не ошибаюсь REST для API,а не для всего сайта или не права?
Цитата (vagrand @ 8.04.2019 - 18:11)
Экранирование и защита от SQL инъекций это по сути своей одно и тоже

Виновата, больше такой ерунды не скажу.
Цитата
Плюс, модель не должна напрямую работать с глобальными массивами вроде $_POST или $_GET. Контроллер должен ей передавать данные, а откуда уж они будут взяты, это решать ему.

Передавать без обработки, как есть?
Цитата (vagrand @ 8.04.2019 - 18:11)
Зачем нужно чистить html тэги при получении данных от пользователя?

Какая-то скотина периодически отправляет то массивы, то html код.
Тегов быть не должно-значит strip_tags()
Цитата (vagrand @ 8.04.2019 - 18:11)
В любом случае, при записи в БД я бы не рекомендовал делать ни того, ни другого.

Почему?
Цитата (twin @ 8.04.2019 - 18:16)
"Чистить" их должна модель. Имеется ввиду валидация и может быть какая то фильтрация. Но модель ничего не должна знать, откуда взялись данные. Из POST, ШМОСТ или из под кровати.

Поняла smile.gif
Всем спасибо за ответы, если есть у кого что добавить-пишите.
Плюсики сегодня проставлю всем за оперативность и за подробные ответы.
Valick
Эли4ка, а когда отправляешь ajax запрос на сервер и получаешь в ответ json, чем тебе не api?


_____________
Стимулятор ~yoomoney - 41001303250491
Эли4ка
Цитата (Valick @ 8.04.2019 - 18:41)
Эли4ка, а когда отправляешь ajax запрос на сервер и получаешь в ответ json, чем тебе не api?

То есть MVC + AJAX и мы получаем REST? Я думала это иначе как-то sad.gif
vagrand
Эли4ка
Цитата
Какая-то скотина периодически отправляет то массивы, то html код.


Если кто-то передает не то, что ты ожидаешь, то надо провалидировать и выдать соответствующую ошибку, а не тихо записать в БД то, что тебя не удовлетворяет.

Цитата
Передавать без обработки, как есть?


Если под обработкой ты подразумеваешь экранирование, то да, без нее. Это работа самой модели.

Цитата
Тегов быть не должно-значит strip_tags()


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


$text = 'Some <b>simple</b> text <-> for test';
echo strip_tags($text);


Вернет строку "Some simple text for test", хотя возможно, что подстрока "<->" была важна, но ты ее вырезала и ее уже не вернуть. В таком случае лучше уже htmlspecialchars() при выводе сделать.



_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Zzepish
twin
Видимо мы друг друга не так поняли. Я имел ввиду, в своем ответе, что там может быть полный набор данных, а не только $_POST (просто привык работать с объектами типа Requestб которые обычно и передают), а ты завязался конкретно на $_POST. Т.е. я пошел мыслить более абстрактно, ты- более конкретно smile.gif

P.S. в контроллер уже попадает Request, которые собирается где-то на уровне диспатчера
twin
Вопрос был недвузначный. Какой из вариантов. А, б, или с. Kusss ответил а. И это неверно. smile.gif


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Эли4ка
Цитата (vagrand @ 8.04.2019 - 19:13)
Если кто-то передает не то, что ты ожидаешь, то надо провалидировать и выдать соответствующую ошибку, а не тихо записать в БД то, что тебя не удовлетворяет.

Так как я ожидаю слово длинной не более 25 символов, то я делаю так:если отправили массив-гасим и все, если html - то удаляем теги.
Цитата (vagrand @ 8.04.2019 - 19:13)
Если под обработкой ты подразумеваешь экранирование, то да, без нее. Это работа самой модели.

Поняла smile.gif
Цитата (Zzepish @ 8.04.2019 - 19:18)
P.S. в контроллер уже попадает Request, которые собирается где-то на уровне диспатчера

blink.gif
на самом деле я приняла следующие допущения:обычный пользователь шкодить не будет и в худшем случае отправит текст с ошибками, хакер на то он и хакер, что отправит не через форму и не простую строку-поэтому максимально надо все херить и не жалеть. Надеюсь это более менее адекватно я поступаю.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.