SafeCracker использует встроенный ExpressionEngine Метод санации XSS для очистки отправленных пользователем данных от уязвимостей межсайтового скриптинга (XSS) и SQL-инъекций.
Любой пользовательский ввод на передней панели очищается с помощью $this->EE->security->xss_clean()
перед вставкой в базу данных или выводом на экран.
К счастью для нас, инженеры EllisLab предоставили секретный недокументированный способ «белого списка» fieldtypes и field_ids , используемый в SafeCracker, и освобождает их от фильтрации XSS.
Чтобы SafeCracker не удалял весь HTML из заданного поля, откройте следующий файл в зависимости от используемой версии ExpressionEngine:
EE 2.1.3 или более ранние (SafeCracker установлен как стороннее дополнение)
/system/expressionengine/third_party/safecracker/libraries/safecracker_lib.php
EE 2.2.0 или более поздняя версия (SafeCracker установлен как модуль сторонних производителей)
/system/expressionengine/modules/safecracker/libraries/safecracker_lib.php
Примечание: ExpressionEngine 2.2.0 объединяет SafeCracker как модуль сторонних производителей, поэтому расположение вашей установки будет зависеть от того, какую версию вы используете или обновили.
Прокрутите вниз до значения Строка 2371 (для EE 2.1.3) или Строка 2516 (для EE 2.2) и найдите следующее:
$this->skip_xss_fieldtypes = array();
$this->skip_xss_field_ids = array();
Здесь начинается самое интересное. Чтобы «внести в белый список» поле от применения фильтра XSS, просто добавьте fieldtype или field_id в любой массив.
Вот пример:
$this->skip_xss_fieldtypes = array(
// This is the fieldtype as specified in the Control Panel
// Channel Fields, not what you use in your SafeCracker template
'textarea'
);
$this->skip_xss_field_ids = array(
// This is the field_id from the exp_channel_data MySQL Table
'field_id_1'
);
Вы можете указать определенный тип fieldtype (textarea, input и т. Д.) Или field_id , если вы хотите быть более явным. Первый способ более общий, а второй - абсолютный и более гибкий, если пользовательское поле когда-либо изменит свой тип.
С этими изменениями к любым полям, которые вы освобождаете от метода санации XSS, больше не будет применяться фильтрация, что позволит отправлять произвольный HTML-код в базу данных!
Имейте в виду, что любые обновления ExpressionEngine могут перезаписывать этот файл, поэтому вы можете изменить разрешения для файла или сохранить резервную копию под рукой.
Межсайтовый скриптинг следует воспринимать очень серьезно, так как вы никогда не захотите, чтобы ваш сайт был источником атаки. Всегда ошибаться в сторону предостережения.