Comments 65
Абсолютно согласен с AntonioLeavez, нам, как разработчикам на CMS 1С-Битрикс, важно получать актуальную информацию по возможным проблемам разработанных и\или разрабатываемых проектов на 1С-Битрикс с точки зрения безопасности, т.к. данная тема всё больше становиться актуальной и несет за собой дополнительные риски для разработчиков при взаимодействии с Заказчиком\Клиентом.
Экранировать на входе — ну тут правда вопрос. Согласен что сами данные на входе опасности не несут, ее несет обрабатывающий код.
$name = htmlentities($_POST['name'], ENT_QUOTES, «UTF-8»);
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
Что это за кусок бреда?
Потом люди читают такие статьи и пишут свои битриксы, где дырка на дырке.
А люди не понимают, но они где-то краем уха слышали про какие-то плохие символы, которые надо фильтровать. И они фильтруют всеми подряд функциями какие найдут, вырезают зачем-то теги и РЕЖУТ КАВЫЧКИ ВО ВХОДНЫХ ДАННЫХ СРЕДСТВАМИ СЕРВЕРА!!! Капец.
Нет плохих данных, никакие данные сами по себе навредить не могут.
Только код, который обрабатывает эти данные.
Так и фильтровать/экранировать нужно только в момент обработки и только так, как эти обработка предполагает.
Если контекст вывода — html, то фильтровать надо при обработке функцией htmlspecialchars с нужной комбинацией флагов, в зависимости, опять-таки, от контекста использования конкретно этих данных в конкретном месте приложения.
Фильтрация не предполагает бездумных решений, Вы абсолютно правы.
Тогда уж, наверное, стоит воспользоваться встроенным механизмом фильтрации
При выдаче результата из базы должны экранироваться теги.
Это конечно я «грубо», иногда зависит от ситуации, но для первого правила должно быть именно так.
Суть проблемы в том, что для огромного количества сайтов, созданных на платформе 1С-Битрикс — эта уязвимость актуальна.
Кроме этого, в апреле, я передал всю информацию в Битрикс.
Естественно, на их ресурсах, этой проблемы нет.
Их стандартные компоненты этой уязвимостью не страдают. В админке кстати тоже.
Уязвимы только сайты, которые работают напрямую с API (моделью), минуя стандартные компоненты (контроллеры) и вьюхи (шаблоны). И при этом не фильтруют данные.
Т.е. криворукие быдлокодеры накосорезили, но виноват, разумеется, Битрикс.
Самое смешное, что Битрикс ничего в этом случае сделать не может. Ещё раз, API — это модель, её задача хранить данные как есть, и в ней, вообще говоря, ошибок нет. Добавлять в неё фильтрацию, htmlspecialchars и т.п. — нельзя, это сломает вообще кучу всего.
Сдается мне, кто-то захотел срубить кармы на врожденной неприязни у хабраюзеров к Битриксу ))
В Битрикс эту проблему еще в апреле отправил, и меры были приняты, многое исправлено.
При всем этом, актуальность этой угрозы безопасности сохраняется и сегодня.
Но речь не о том, что понимать под «интегратором», а что под «т.н. веб-студиями» (но попытку подмены тезиса я оценил, Вы молодец )), а в том, что в стандартных компонентах данные уже фильтруются, и уязвимости нет — проблема автором высосана из пальца. Ну а фильтровать данные в собственном решении Вам никто не запрещает
Все правильно написано.
В статье, я также обращаю внимание на то, что у готового интернет-магазина «из коробки» проблема отсутствует.
Но при разработке серьезных проектов, штатных компонентов недостаточно, используется API.
Проблема возникает именно в этом случае, и встречается крайне часто.
На счет «проблема высосана из пальца» — Ваше мнение.
- коробочные решения и системные компоненты защищены и уязвимость в них не проявляется
- API Битрикс позволяет разработчикам совершать ошибки при разработке собственных решений и компонентов
- Вывод: в API Битрикс существует уязвимость (уязвимость типа «недалекий разработчик», видимо)
Что интересно — криворукие разработчики встречаются на любой платформе, так почему именно Битрикс? Возможно потому, что просто очередную статью о фильтрации данных форм никто бы и читать не стал. Впрочем, как Вы верно заметили, это мое мнение, как и все, написанное мной ранее — нет нужды лишний раз это подчеркивать. ;)
1. У «коробки» Битрикс этой проблемы нет.
2. API Битрикс действительно позволяет совершать ошибки разработчикам.
3. На счет уязвимости типа «недалекий разработчик», не соглашусь с Вами.
Дело в том, что изначально, в документации к API Битрикс:
http://dev.1c-bitrix.ru/api_help/forum/developer/cforumtopic/getlist.php
Были приведены примеры использования, а именно:
while ($ar_res = $db_res->Fetch())
{
echo $ar_res["TITLE"]."<br>";
}
После того, как информацию по проблеме была предоставлена Битрикс, пример был «отредактирован»:
while ($ar_res = $db_res->Fetch())
{
echo htmlspecialcharsbx($ar_res["TITLE"])."<br>";
}
Поэтому, я не согласен с Вами, только в части «криворуких разработчиков», а так, все верно.
В письмо встраивался html + inline css код, который добавлял прозрачный слой с position:absolute на весь экран, обернутый в ссылку на фейк сайт злоумышленника.
Так, как слой перекрывал весь интерфейс почты, по любому клику в любом месте происходил редирект на фейк, который выглядел как страница логина в мейл.ру и невнимательный пользователь думал, что его просто выкинуло из сессии при входе в просмотр письма и клику например на «Входящие». Я к тому, что сценарии эксплуатации подобных вещей имеются, но немало зависит от контекста. В почте это было опасно.
Данные в базе должны храниться в том виде, в котором их ввел пользователь. Фильтровать только при выводе.
Данные фильтруются в контроллере («компоненте» в терминах битрикса), чтобы мега-разработчик шаблона выводил $arUser[«NAME»] и не задумывался о фильтрации. Но для тех случаев, когда нужны нефильтрованные данные, компонент добавляет специальный ключ $arUser["~NAME"], о котором знают не только лишь все.
Часть Битрикса теперь официально именуется Bitrix Framework
Ну именовать они могут как угодно, но это не означает что так и есть.
Никто не запрещает не использовать админку Битрикса, не использовать никакие штатные компонента Битрикса и использовать Битрикс только в качестве фреймворка.
Ну во первых это не тоже самое, с тем что я приводил для примера с symfony components. Во вторых, мне страшно представить, что будет если брать их сборник низкокачественного кода и что-то на нем делать.
Не надейтесь на фильтрацию по расширению. :)#bitrix #security #shell #1c pic.twitter.com/rXAwP6DjP1
— p0z (@a_p0z) 27 апреля 2016 г.
Из смешного, в последнее время, только обход фильтра по типу ononclick='JS', когда фильтр Битрикс синтаксически 'on' отрезал, для блокировки той-же XSS. Сейчас, конечно, фильтр проактивки стал достаточно серьезным.
Версию Битрикса не скажу, к сожалению. Думаю, что не самая свежая на тот момент.
В ваших конфигах для веб-серверов не учтены частные случаи:
- иногда люди заключают атрибуты тегов не в кавычки, а в апострофы
- когда пользовательский ввод вставляется в генерируемый на серверной стороне js (запрета символа " явно недостаточно, надо добавить ' и { })
DeLuxis, так это зависит от Владельцев или студий сопровождающие сайты\интернет-магазины, которым не безразлична безопасность собственных проектов.
К тому же, вариант устранения уязвимости, так же представлен в статье, нужно только воспользоваться предложенным решением, хотя именно это самое сложное, воспользоваться.....:)))))
2. htmlspecialchars и т.п. — не панацея от xss.
3. Часто нужно хранить сырые данные.
Выше, в комментариях я написал, что явилось (как один из вариантов) причиной появления систематики этой угрозы безопасности.
Если говорить о вышеописанной проблеме, то есть больше сомнения в целесообразности хранения этих данных «сырыми».
На счет защиты и панацеи, htmlspecialchars — является одним из способов защиты от XSS.
2. Один из способов, но не панацея. xss успешно пролезают через него, если понадеятся только на него.
3. Ну в этом случае сырые данные может не нужны. А в другом нужны.
Допустим name — это логин.
Тогда для фильтрации обработку нужно будет использовать еще в фильтре.
А если мы потом изменим второй параметр в htmlspecialchars($_POST['name'], ENT_QUOTES);
Или захотим вообще вырезать hmtl.
Или нужно пропустить часть html — ссылки, списки, рисунки (в комментрии пользователя к статье).
:)
preg_match('/^[-_a-zа-я0-9]{3,100}$/ui',$_POST['name'])
Cистематическая уязвимость сайтов, созданных на CMS 1С-Битрикс