Посоветуйте, как упростить работу с Html::encode

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Ghost_nsk
Сообщения: 825
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

Посоветуйте, как упростить работу с Html::encode

Сообщение Ghost_nsk »

Всем привет. Есть допустим проект, в котором определенное количество моделек Active Record, в каждой есть свои атрибуты, доступные для ввода юзером и есть большая куча вьюшек. Задача - предотвратить XSS. Собственно в валидацию кидаем HtmlPurifier для полей, где доступен html ввод, а отображение обычных полей во вьюшках выводим через Html::encode. Есть какой-то вариант глобально задать поведение атрибутов при выводе, чтобы не надо было везде прописывать Html::encode?

Кто как работает?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение futbolim »

Пурифить при выводе.
Энкодить тоже.
Создал обёртку и теперь echo e($model->name) и энкод во вьюшках не напрягает.
Аватара пользователя
Ghost_nsk
Сообщения: 825
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение Ghost_nsk »

futbolim писал(а): 2017.09.23, 10:46 Пурифить при выводе.
Энкодить тоже.
Создал обёртку и теперь echo e($model->name) и энкод во вьюшках не напрягает.
1) ну пурифить каждый раз при выводе, насколько я читал и понял из доки - весьма прожорливая вещь (поэтому вроде как рекомендуется ее ставить на beforesave)
2) ща пока пришел к решению strip_tags в beforeValidate / beforeSave на все атрибуты с пользовательским вводом, где не должно быть html
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение maleks »

Ghost_nsk писал(а): 2017.09.23, 11:06 1) ну пурифить каждый раз при выводе, насколько я читал и понял из доки - весьма прожорливая вещь (поэтому вроде как рекомендуется ее ставить на beforesave)
В доках ничего такого не рекомендуется, предлагается использовать кеш:
<?= \yii\helpers\HtmlPurifier::process($description) ?>
Note that HtmlPurifier processing is quite heavy so consider adding caching.
Ghost_nsk писал(а): 2017.09.23, 11:06 2) ща пока пришел к решению strip_tags в beforeValidate / beforeSave на все атрибуты с пользовательским вводом, где не должно быть html
не нужно все это. Чтобы Html::encode не бояться "забыть" посмотрите в сторону шаблонизаторов.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение samdark »

1) ну пурифить каждый раз при выводе, насколько я читал и понял из доки - весьма прожорливая вещь (поэтому вроде как рекомендуется ее ставить на beforesave)
Ни в коем случае. Кешировать — ОК, но не в beforeSave.
Аватара пользователя
Ghost_nsk
Сообщения: 825
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение Ghost_nsk »

samdark писал(а): 2017.09.23, 22:02
1) ну пурифить каждый раз при выводе, насколько я читал и понял из доки - весьма прожорливая вещь (поэтому вроде как рекомендуется ее ставить на beforesave)
Ни в коем случае. Кешировать — ОК, но не в beforeSave.
Все понял, спс

P.S. strip_tags не вариант использовать, потому что <b>фамилия (поле 1) и имя </b> (поле2) - не очищается, поэтому можно спокойно провести xss, так что возвращаемся к обычному Html::encode()
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение maleks »

Ghost_nsk писал(а): 2017.09.24, 03:50 strip_tags не вариант использовать, потому что <b>фамилия (поле 1) и имя </b> (поле2) - не очищается,
О чем это вы?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
Ghost_nsk
Сообщения: 825
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение Ghost_nsk »

maleks писал(а): 2017.09.24, 06:48
Ghost_nsk писал(а): 2017.09.24, 03:50 strip_tags не вариант использовать, потому что <b>фамилия (поле 1) и имя </b> (поле2) - не очищается,
О чем это вы?
Допустим есть форма для ввода контактной инфы по юзеру, там есть поля фамилия, имя, отчество. Если вбиваем в фамилию и имя значения с неполными тегами, например, "<b>вася" и 2 значение - "пупкин</b>", то strip_tags не сработает по регулярке, и если на сайте предусмотрена склейка в фио в одну строку, то будет выделение жирным. Так что энкодить надо в любом случае
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение maleks »

Ghost_nsk писал(а): 2017.09.24, 07:21 "<b>вася" и 2 значение - "пупкин</b>", то strip_tags не сработает по регулярке,
Не замечаю такого поведения. Все вырезает.

Код: Выделить всё

print htmlspecialchars(strip_tags('<b>fff'));// fff
Yii2 universal module sceleton - for basic and advanced templates
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение zelenin »

Ghost_nsk писал(а): 2017.09.23, 08:26 Всем привет. Есть допустим проект, в котором определенное количество моделек Active Record, в каждой есть свои атрибуты, доступные для ввода юзером и есть большая куча вьюшек. Задача - предотвратить XSS. Собственно в валидацию кидаем HtmlPurifier для полей, где доступен html ввод, а отображение обычных полей во вьюшках выводим через Html::encode. Есть какой-то вариант глобально задать поведение атрибутов при выводе, чтобы не надо было везде прописывать Html::encode?

Кто как работает?
модель никак не соотносится с выводом данных. модель должна хранить исходные, введенные юзером, данные, если не существует бизнес-требования, что данные должны быть очищены от html-тегов например, потому что потому.
XSS - это не бизнес требование, а значит чистить данные ты должен при выводе во вьюхе, причем существует другой кейс - вывод в консоли - где данные можно и нужно отдавать как есть.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение samdark »

А кроме консоли ещё и REST API, push-нотификации и т.д. и т.п.
Аватара пользователя
Ghost_nsk
Сообщения: 825
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

Re: Посоветуйте, как упростить работу с Html::encode

Сообщение Ghost_nsk »

Все понял, ребята, спасибо за полезную инфу
Ответить