Шаблонизатор Smarty - нужно ли автоэкранирование?

hell0w0rd

Продвинутый новичок
Дело не в "лень", а в "легко забыть".

Смотрим, например, http://corp.*****.com/security-board/, считаем сколько там xss-ов. Уверен, что если бы в blitz templates был автоэскейпинг, xss-ов бы было ровно 0 (ну может один очень хитрый =). (Кстати, он в blitz таки недавно появился.)

Утверждение, что "разработчик сам знает", сродни утверждению "разработчик сам знает, где при составлении sql-запроса присунуть mysql_real_escape_string", что очевидная фигня.
Они на хабре разместили статью недавно, где рассказали что "кардинально сменили систему шаблонизации, установив автоэскейпинг всех данных по умолчанию"
 

fixxxer

К.О.
Партнер клуба
Да думаю что не так все просто.
Наверняка если таже так и сделали, то остались пачки html-я, генеряемые php-вьюхами, и туда просто недолго думая воткнули |raw (или как оно там) вместо честного парсинга подшаблона;)
Нельзя же просто так все сразу разгрести.
 

WMix

герр M:)ller
Партнер клуба
Впрочем, хорошо, забудем про десяток. Вернёмся к одному примеру, что у нас уже есть.
Переменная $url содержит строку с русскими символами в кодировке UTF-8.
я несколько иначе отвечу на твой вопрос,

итак есть 2 выхода:
1. всегда аутоэскейпить и когда это не нужно отключать.
2. аутоэскейпить только там где это нужно.

почему первый способ лучше второго? потому что "то нужно отключить escape" ты это заметишь сразу или близко к сразу => программа не работает, ошибка!
во втором случае "то нужно включить escape" увидеть очень сложно, а в это время ктото считывает пароли из превьюшки чата рядом с диалогом регистрации...
или повторюсь
Дело не в "лень", а в "легко забыть"..
 

AnrDaemon

Продвинутый новичок
Программист, страдающий забывчивостью - это катастрофа, только и ждущая, чтобы случиться. Никакое количество автоматизации не спасёт.
Против такого надо нарабатывать защитные рефлексы.
Когда я после травмы стал замечать, что мне стало труднее запоминать и сосредотачиваться, я начал целенаправленно тренировать приёмы, направленные на безопасность. Сумки с ключами, или программного кода - не суть важно. Важно то, что если я что-то забыл, я это вижу. Не знаю, как объяснить. Просто вижу. И исправляю. И вообще стараюсь ещё на стадии написания кода не делать ошибок, которые бы потом пришлось дорого и долго исправлять.

Кстати, подумал про ваш пример с "99% надо экранировать". 99% выводимых данных (у меня) - предварительно сформированный WYSIWYG'овый HTML. Уродство редкое, да. Если его экранировать - ... сами понимаете, толку будет от такого сайта немного.
 

fixxxer

К.О.
Партнер клуба
99% выводимых данных (у меня) - предварительно сформированный WYSIWYG'овый HTML
тогда, конечно, толку мало. но так бывает редко

в остальном чушь.
зачем всякие prepated statements? пиши себе ручками quote() и intval(), не забудешь че.
 

AnrDaemon

Продвинутый новичок
Редко? Не знаю, какие задачи решаете вы, но блоги, форумы, и прочая дрянь, лезущая изо всех щелей интернета в последнее время, только этим и живёт.

Prepared statement в отдельных случаях сокращают время зависания в БД на 5-15%.
Это кроме того, что правильно написанный для препарации запрос приятнее читать, чем мешанину из quote() и intval(). Вот такое я странное существо - люблю красоту.
 

hell0w0rd

Продвинутый новичок
AnrDaemon так а чем по вашему плохо сделать по умолчанию везде экранирование? Ну вывели вы свой редактор на этапе разработки, расставили |raw где нужно. В противном случае это самонадеянность, что нигде не забудете, программисты всегда забывают и ошибаются, потому и существуют тестировщики и тесты в принципе, мы же люди.
Я бы для подобных вещей вообще сниппет/макрос/функию - как в вашем шаблонизаторе это называется. Чтобы не привязывать себя к 1 редактору, и через пару месяцев не заменять по всему проекту
 

Absinthe

жожо
Сколько раз будет применён автоэскейпинг?... Один? Два? Кто больше?
По поводу этого сразу же написано в документации твига. Все прозрачно.
Как в смарти - не знаю.
Какие-то странные отмазки придумываете, чтобы не использовать удобный инструмент?

Не переменнные. Операции вывода. Как можно обработать переданную модель в шаблон целиком?
Мне кто-то тут (fixxxer?) объяснял, что ее можно рекурсивно проксировать. Однако действующих рабочих решений не видел, а способ мне кажется ужасным.

Мне кажется, это прямое сравнение с подготавливаемыми запросами.
Использование автоэкранирование и подстановка в подготовленное выражение переменные vs ручная установка богомерзких escape и склеивание строки запроса по кусочкам.
 

Фанат

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

Ragazzo

TDD interested
fixxxer
<offtop>
Задумался что-то я и заметил, что на этом скрине она без лифчика походу, там слева выпирает :)
</offtop>
 

Absinthe

жожо
Фанат если не смешивать языки и писать html, css и js в отдельных файлах - проблем нет.
 

fixxxer

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

fixxxer

К.О.
Партнер клуба
Про Фанатовские типизированные плейсхолдеры точно на этапе проектирования никто не думал. :D

Нативные prepared statements это-то совсем другое, это четкое разделение "кода" и "данных", тут конечно. Если хочется чего-то такого в html-шаблонах, xslt в руки ;)
 

AmdY

Пью пиво
Команда форума
fixxxer
<offtop>
Задумался что-то я и заметил, что на этом скрине она без лифчика походу, там слева выпирает :)
</offtop>
это киношная штука, есть вроде даже статистика, что торчащие соски значительно увеличивает количество просмотров.
а эскейпинг - это ерунда, до твига я сразу эскейпил входные данные, сейчас это делает шаблонизатор. кстати, в ZF View::escape дырявый и пропускает xss инъекцию, после отпуска могу покапаюсь в тикетах и приведу пример.
 
Сверху