Проблема с цитатами для анонимных пользователей (модуль quote+ckeditor4)

Аватар пользователя rgzrgz1 rgzrgz1 28 марта 2018 в 17:32

Всем привет. На форуме сделал цитирование с помощью модуля quote. Связка quote+ckeditor отлично работает для админа, но вот для анонима не хочет.

При клике на цитату, открывается новая страница с цитированием, Но ckeditor удаляет quote. Если цитировать через plain text, то работает.

Что я пробовал:
1. Посмотрел права Анонима /people/permissions и дал все права, теже, что и у админа, во всех пунктах (просто для теста разрешил вообще все)
2. перенес все на чистый Друпал с нуля.
3. в текстовых форматах filtred html указано .
4. В настройках модуля ckeditor не нашел настроек для админа или для анонима.

Подскажите, пожалуйста, куда копать?

Комментарии

Аватар пользователя guban guban 1 апреля 2018 в 0:24

config.allowedContent = true; не помогает. Для анонимов ckeditor по прежнему не отображает quote. (для админа работает)
+Пробовал все версии ckeditor начиная с 3.6
+Просмотрел все ишью ckeditor + quote
+просмотрел всю выдачу "ckeditor" break "quote", и другие запросы.

Уже не знаю что делать.

Аватар пользователя Semantics Semantics 1 апреля 2018 в 0:35

так может всё проще и просто у анонимов нет прав на формат ввода, где поддерживаются цитаты?

Аватар пользователя guban guban 1 апреля 2018 в 0:43
Semantics wrote:

так может всё проще и просто у анонимов нет прав на формат ввода, где поддерживаются цитаты?

формат filtred html. CKEditor для анонима загружается. Анонимы могут использовать quote в filtred html и сам формат ввода filtred html.

Кстати при цитировании анонимом в CKEditor видно, как на доли секунды появляется

[quote=admin] ...text [/quote]

и пропадает сразу же. Оставляя CKEditor пустым.

попробовал создать новый формат ввода, где разрешено вообще всех для всех ролей. Результат: для админа работает, для анонима нет.

Аватар пользователя rgzrgz1 rgzrgz1 3 апреля 2018 в 20:30

Решения по прежнему нет. Даже full html со всеми разрешениями не работает для анонимных пользователей на чистом тестовом Друпале.
В чем может быть отличие, если я анонимным пользователям разрешил все тоже самое, что и для администратора (чтобы проверить, будет ли работать). Картина та же.

Аватар пользователя rgzrgz1 rgzrgz1 3 апреля 2018 в 23:45

В консоли только предупреждение:

warning [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

у администратора такое же предупреждение, но цитаты работают.

Аватар пользователя guban guban 6 апреля 2018 в 12:14

Дело не в Друпале, не в 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
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;
  }

  

$format filter_format_load($_POST['input_format']);
  if (
$format == FALSE || !is_object($format) || !filter_access($format)) {
    exit;
  }

  

module_load_include('inc''ckeditor''includes/ckeditor.lib');

  

$text $_POST['text'];
  
$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;
    }

    

// Built-in filter module, a special case where we would like to strip XSS and nothing more
    
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]) {

        

// Sources of inspiration:
        // 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

        

$base_allowed_tags = array('a','abbr','acronym','address','area','article','aside','audio','b','base','basefont',
          
'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',
        );

        

// Get tags allowed in filter settings
        
$filter_allowed_tags preg_split('/\s+|<|>/'$object->settings['allowed_html'], -1PREG_SPLIT_NO_EMPTY);

        

// Combine allowed tags
        
$tags array_merge($base_allowed_tags$filter_allowed_tags);

        

// Tags provided by hook
        
$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);
            }
          }
        }

        

$text filter_xss($text$tags);
      }
      continue;
    }
    
$text $filters[$name]['process callback']($text$format_filters[$name], $format''TRUE$cache_id);
  }

  echo 

$text;
}

?>

Но если к разрешенным добавить quote, то ничего не изменится, цитаты будут ломаться, пока ckeditorAjaxCall', false)) {

Так же не спасет добавление разрешенных тэгов в текстовые форматы. Хоть все разреши во всех форматах, цитаты будут ломаться.

function ckeditor_filter_xss() не пропускает quote.

И так, кто подскажет выход из данной ситуации?

Аватар пользователя rgzrgz1 rgzrgz1 6 апреля 2018 в 23:30

Безопасно ли будет менять эту строку?

$_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)) {

Аватар пользователя Ilya_ Ilya_ 7 апреля 2018 в 16:17

Присоединяюсь к вопросу.
А если просто закомментировать эту функцию или как-то переделать, чтобы цитаты остались?