Использование SafeCracker в ExpressionEngine удаляет встроенные стили HTML и CSS - PullRequest
1 голос
/ 24 июня 2011

У меня есть форма, построенная с SafeCracker в ExpressionEngine. Одно из полей textarea используется для предоставления пользователям возможности отправлять HTML-код.

Вот пример типа кода, который они будут предоставлять:

<div style="left: 385px; top: 137px;" class="aaa"></div>.

Когда форма отправлена ​​и запись сохранена в базе данных, SafeCracker удаляет встроенный стиль CSS. Результат того, что фактически сохраняется в базе данных:

<div class="aaa"></div>.

Как видите, встроенные стили CSS удаляются, но остальная часть HTML сохраняется.

Я хочу, чтобы пользователи могли отправлять HTML-код и не использовать SafeCracker для удаления встроенных стилей CSS. Как мне это сделать?

1 Ответ

3 голосов
/ 24 июня 2011

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 могут перезаписывать этот файл, поэтому вы можете изменить разрешения для файла или сохранить резервную копию под рукой.

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

...