Всем привет. На форуме сделал цитирование с помощью модуля quote. Связка quote+ckeditor отлично работает для админа, но вот для анонима не хочет.
При клике на цитату, открывается новая страница с цитированием, Но ckeditor удаляет quote. Если цитировать через plain text, то работает.
Что я пробовал:
1. Посмотрел права Анонима /people/permissions и дал все права, теже, что и у админа, во всех пунктах (просто для теста разрешил вообще все)
2. перенес все на чистый Друпал с нуля.
3. в текстовых форматах filtred html указано .
4. В настройках модуля ckeditor не нашел настроек для админа или для анонима.
Подскажите, пожалуйста, куда копать?
Комментарии
config.allowedContent = true; не помогает. Для анонимов ckeditor по прежнему не отображает quote. (для админа работает)
+Пробовал все версии ckeditor начиная с 3.6
+Просмотрел все ишью ckeditor + quote
+просмотрел всю выдачу "ckeditor" break "quote", и другие запросы.
Уже не знаю что делать.
так может всё проще и просто у анонимов нет прав на формат ввода, где поддерживаются цитаты?
формат filtred html. CKEditor для анонима загружается. Анонимы могут использовать quote в filtred html и сам формат ввода filtred html.
Кстати при цитировании анонимом в CKEditor видно, как на доли секунды появляется
и пропадает сразу же. Оставляя CKEditor пустым.
попробовал создать новый формат ввода, где разрешено вообще всех для всех ролей. Результат: для админа работает, для анонима нет.
Решения по прежнему нет. Даже full html со всеми разрешениями не работает для анонимных пользователей на чистом тестовом Друпале.
В чем может быть отличие, если я анонимным пользователям разрешил все тоже самое, что и для администратора (чтобы проверить, будет ли работать). Картина та же.
А в консоли браузера есть ошибки?
В консоли только предупреждение:
у администратора такое же предупреждение, но цитаты работают.
Дело не в Друпале, не в quote и не в плагине ckeditor. Все дело в модуле ckeditor.
Модуль определяет функцию, вызываемую с помощью ajax-запроса, которая фильтрует текст перед его передачей в редактор, чтобы предотвратить определенные межсайтовые атаки скриптов на изменение содержимого (которые библиотека JavaScript может не обработать).
Начиная с версии 7.x-1.16
Цитаты ломает функция модуля (строка 229 в файле ckeditor\includes\ckeditor.page.inc):
<?php
function ckeditor_filter_xss() {
header('Content-Type: text/plain; charset=utf-8');
$GLOBALS['devel_shutdown'] = FALSE;
if (!isset(
$_POST['text']) || !is_string($_POST['text']) || !isset($_POST['input_format']) || !is_string($_POST['input_format']) || !isset($_POST['token']) || !drupal_valid_token($_POST['token'], 'ckeditorAjaxCall', false)) {exit;
} ?>
Если изменить значение false на true, цитаты не ломаются анонимным пользователям, но тогда дыра в безопасности.
Интересно, начиная с версии 7.x-1.16 в самом низу этого файла был добавлен код, с разрешенными тэгами:
<?php
$format = filter_format_load($_POST['input_format']);
module_load_include('inc', 'ckeditor', 'includes/ckeditor.lib');
$text = $_POST['text'];
// Built-in filter module, a special case where we would like to strip XSS and nothing more
// Sources of inspiration:
$base_allowed_tags = array('a','abbr','acronym','address','area','article','aside','audio','b','base','basefont',
// Get tags allowed in filter settings
// Combine allowed tags
// Tags provided by hook
$text = filter_xss($text, $tags);
function ckeditor_filter_xss() {
header('Content-Type: text/plain; charset=utf-8');
$GLOBALS['devel_shutdown'] = FALSE;
if (!isset(
$_POST['text']) || !is_string($_POST['text']) || !isset($_POST['input_format']) || !is_string($_POST['input_format']) || !isset($_POST['token']) || !drupal_valid_token($_POST['token'], 'ckeditorAjaxCall', false)) {exit;
}
if ($format == FALSE || !is_object($format) || !filter_access($format)) {
exit;
}
$filters = filter_get_filters();
$format_filters = filter_list_format($_POST['input_format']);
$security_filters = ckeditor_security_filters();
$cache_id = $_POST['input_format'] . ':' . '' . ':' . hash('sha256', $text);
foreach ((array)
$format_filters as $name => $object) {//If filter is not security filter, not exists, cannot be called or isn't enabled in selected text format then skip this filter
if (!isset($security_filters['filters'][$name]) || !isset($filters[$name]) || !isset($filters[$name]['process callback']) || $object->status == 0) {
continue;
}
if ($name == 'filter_html' && $security_filters['filters']['filter_html'] == 1) {
preg_match_all("|</?([a-z][a-z0-9]*)(?:\b[^>]*)>|i", $text, $matches);
if ($matches[1]) {
// http://www.w3.org/TR/html4/index/elements.html
// http://www.w3.org/TR/html-markup/elements.html
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
'bdi','bdo','big','blockquote','body','br','button','canvas','caption','center','cite','code','col','colgroup',
'command','datalist','dd','del','details','dfn','dialog','dir','div','dl','dt','em','fieldset','figcaption',
'figure','font','footer','form','h1','h2','h3','h4','h5','h6','head','header','hgroup','hr','html','i','img',
'input','ins','isindex','kbd','keygen','label','legend','li','main','map','mark','menu','menuitem','meter',
'nav','noframes','noscript','ol','optgroup','option','output','p','param','pre','progress','q','rp','rt',
'ruby','s','samp','section','select','small','source','span','strike','strong','sub','summary','sup','table',
'tbody','td','textarea','tfoot','th','thead','time','title','tr','track','tt','u','ul','var','video','wbr',
);
$filter_allowed_tags = preg_split('/\s+|<|>/', $object->settings['allowed_html'], -1, PREG_SPLIT_NO_EMPTY);
$tags = array_merge($base_allowed_tags, $filter_allowed_tags);
$hooks_allowed_tags = module_invoke_all('ckeditor_filter_xss_allowed_tags');
if (!empty($hooks_allowed_tags) && is_array($hooks_allowed_tags)){
foreach($hooks_allowed_tags as $tag ){
if (!empty($tag) && is_string($tag) && !in_array($tag,$tags)){
array_push($tags,$tag);
}
}
}
}
continue;
}
$text = $filters[$name]['process callback']($text, $format_filters[$name], $format, '', TRUE, $cache_id);
}
echo
$text;} ?>
Но если к разрешенным добавить quote, то ничего не изменится, цитаты будут ломаться, пока ckeditorAjaxCall', false)) {
Так же не спасет добавление разрешенных тэгов в текстовые форматы. Хоть все разреши во всех форматах, цитаты будут ломаться.
function ckeditor_filter_xss() не пропускает quote.
И так, кто подскажет выход из данной ситуации?
Безопасно ли будет менять эту строку?
$_POST['text']) || !is_string($_POST['text']) || !isset($_POST['input_format']) || !is_string($_POST['input_format']) || !isset($_POST['token']) || !drupal_valid_token($_POST['token'], 'ckeditorAjaxCall', false)) {
$_POST['text']) || !is_string($_POST['text']) || !isset($_POST['input_format']) || !is_string($_POST['input_format']) || !isset($_POST['token']) || !drupal_valid_token($_POST['token'], 'ckeditorAjaxCall', true)) {
Присоединяюсь к вопросу.
А если просто закомментировать эту функцию или как-то переделать, чтобы цитаты остались?
Сообщество!
Что, никто не знает?
В офиц. ишью тоже никто не ответил....