Перейти к публикации

Sander1

местные
  • Публикации

    119
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    20

Сообщения, опубликованные пользователем Sander1

  1. Есть похожий баг (хотя может так и задумано).

    Если снять публикацию с модерации, то комментарии от этой публикации и ссылки на неё всё равно будут отображаться в customcomments.

    UPD: Увидел ответ в соседней теме, вопрос снимаю.

  2. Ладно, я понял, что в этом вопросе у нас в корне разный подход к обработке пользовательских данных...

    Я придерживаюсь общепринятой практики, что данные необходимо хранить в чистом виде не изменяя их и не уничтожая.
    Если я написал заголовок Пример <script>alert('test')</script> & \" &copy; – то именно в таком виде он должен сохранится в БД без преобразований и замен. И именно это должен видеть пользователь на странице сайта.

    Задача программиста обеспечить лишь безопасность:
    1. Сохранение этих данных в БД
    2. Отображение данных на сайте (админка, пользователю, метатеги, rss и т.д.)

    В первом случае для этого достаточно $db->safesql(), хотя лучше бы ->prepare, но и так сойдёт. Никаких дополнительных addslashes и htmlspecialchars не нужно.
    Во втором – использовать htmlspecialchars() с соответствующими флагами, как раз чтобы браузер воспринимал этот заголовок как обычный текст, а не как код или html сущности.

    • Поддерживаю 1
  3. 22.10.2024 в 16:42, celsoft сказал:

    Заголовок должен быть написан текстом и нормальными символами, а не HTML кодом.

    С этим я согласен. И вот именно в это суть данной темы. Парсер DLE распознает в тексте заголовка html сущности и заменяет их на соответствующие символы:

    &quot; → "
    &amp; → &
    и т.д.

    Т.е. если я написал заголовок:

    Пример &amp; / & / <b> / &quot; / &#039; / &copy;

    То в таком и именно в таком виде заголовок должен хранится в БД. В DLE же он меняется и сохраняется у же порезанным и преобразованным

    В БД:
    Пример &amp; / &amp; /  / \" / \' / ©
    
    Что видит пользователь на странице:
    Пример & / & / / " / ' / ©
    
    На сайте в исходном коде:
    <title>Пример &amp; / &amp; /  / &quot; / ' / ©</title>

     

    При выводе на сайте, хоть в теле страницы хоть в метатегах достаточно один раз использовать htmlspecialchars($title, ENT_QUOTES | ENT_HTML5, 'utf-8');
    Без последующих костылей вида str_replace('&amp;amp;', '&amp;', $title);

    При нормальном использовании исходный заголовок в исходном коде страницы должен выглядеть так:

    <title>Пример &amp;amp; / &amp; / &lt;b&gt; / &amp;quot; / &amp;#039; / &amp;copy;</title>
    <meta property="og:title" content="Пример &amp;amp; / &amp; / &lt;b&gt; / &amp;quot; / &amp;#039; / &amp;copy;">
    <h1>Пример &amp;amp; / &amp; / &lt;b&gt; / &amp;quot; / &amp;#039; / &amp;copy;</h1>

    И пользователь на странице будет видеть заголовок именно так как задумано и написано в поле заголовка.

     

    К вопросу о безопасности. Я помню этот баг, когда в метатеге заголовка писали тег {content} и движок распознавал его как тег, а не как текст, что действительно ломало верстку. Для этого сейчас вы дополнительно добавили строку:

    $text = str_replace(array("{", "}", "[", "]"), array("&#123;", "&#125;", "&#91;", "&#93;"), $text);

    Но вот проблем с обратным слешем я не вижу вообще никаких. Суть-то в чем. Этот слеш можно написать и сохранить, но его приходится вручную экранировать, чтобы его не вырезал stripslashes, который вообще хз зачем там нужен.

     

    16 часов назад, celsoft сказал:

    Вы не привели.

    Вы задали вопрос – зачем писать html сущности в заголовке. Я просто в гугле нашел первую страницу где в заголовке написано текстом &amp;
    Я не смотрел и не приводил тот сайт как образец правильности заполнения метатегов. Но согласен, что &amp;amp;amp; – это очевидно баг, они взяли экранированный заголовок и повторно экранировали его в описании.

    16 часов назад, celsoft сказал:

    Для чего такую конвертацию проводить?

    Вот именно этим вопросом я задаюсь глядя на код в DLE.

    1. При сохранении $parse->process заменяет & на &amp; и сохраняет в таком виде в БД.
    2. При формировании метатегов в $meta->title($metatags['title']); выполняется вызов метода Helper::escape в котором сначала выполняется замена сущностей на символы html_entity_decode и затем опять экранирование в htmlspecialchars.

    Я понимаю зачем и почему так сделано, но это всё лишь следствие неправильного хранения данных.
    Причем в оригинальном методе класса этого двойного преобразования нет, там только один htmlspecialchars.

  4. 9 часов назад, celsoft сказал:

    Я посмотрю, потому что если честно я на память не помню уже, очень старая функция DLE, и в ней очень давно не было никаких изменений. Но сразу задам вопрос. По вашему ссылки и содержание метатега это одно и тоже? В данной теме автора беспокоят ссылки в HTML документе и для ссылок действительно крайне важно писать &amp; вместо &. А какой тайный смысл писать это в описании? Для чего в описании писать &amp; вместо &? Какой то потребности в этом нет. Поэтому не совсем понятно в чем именно заключается проблема.

    Суть не в том что там обсуждается. Вы задали вопрос – зачем нужна возможность отображения &amp; в заголовке, я привел пример страницы где как раз в заголовке используется &amp; как текст, а не как html сущность.

    Правильно ли заменять HTML сущности на соответствующий символ внутри текста – это отдельная тема и тут нет однозначно правильного мнения.
    К примеру на этом форуме если я пишу &lt; в тексте, то он и выведет &lt; и не заменит на <

    Повторю основную суть. В DLE невозможно создать, к примеру, такой заголовок:

    Почему в адресе необходимо использовать &amp; вместо &

     

  5. 2. Откройте страницу по ссылке. Скопируйте тот заголовок и вставьте его в DLE.
    Вот в этом проблема, что НЕВОЗМОЖНО получить на выходе такой же заголовок как там. Будет так:

    Why should I use & instead of &?

    Вместо правильного:

    Why should I use &amp; instead of &?

    Да даже на этом движке форума, я уверен, если в заголовке прописать &amp; то на странице он так же и будет показан, а не заменён на &.

  6. 1. В обычный заголовок пишу `Пример \ слеша`, в теле страницы вижу заголовок:

    <title>Пример \ слеша</title>

    Если же в метатег заголовка прописать `Пример \ слеша`, то в теле страницы будет:

    <title>Пример слеша</title>

    Получается в одном случае это опасно, в другом – нет?

     

    2. Зачем... Например чтобы можно было сделать такой заголовок:
    https://stackoverflow.com/questions/35367945/why-should-i-use-amp-instead-of

  7. 1. В метатеге заголовка невозможно использовать обратный слеш: \
    Его получится использовать, если экранировать его вручную прописав \\\\, но после повторного сохранения слеш всё равно пропадёт.
    Т.е. stripslashes есть, а addslashes нету.

     

    2. Невозможно нормально использовать HTML сущности в основном и мета заголовке.
    К примеру мне нужно, чтобы был именно такой заголовок в таком же виде:

    Пример &quot;замены" &copy; на ©

    После сохранения новости в БД записывается "исправленный" заголовок (причём ещё зачем-то дополнительно экранируется двойная кавычка):

    Пример \"замены\" © на ©

    Возможно так действительно правильнее/удобнее. Для таких редких случаев можно вручную экранировать символ & → &amp;
    Но проблема в том, что после повторного сохранения – опять получим "исправленный" заголовок.


    Пишу заголовок:

    Пример &amp;quot;замены" &amp;copy; на ©

    В БД он записывается в таком же виде (разве что кавычка лишний раз экранируется слешем).
    На сайте в заголовке и на странице он отображается корректно именно так как задумано (чтобы писало &quot; и &copy; текстом)

    Открываю редактирование и вижу уже "исправленный" заголовок:

    Пример "замены" © на ©

    Ну и после сохранения, соответственно, полностью теряется исходный заголовок.

  8. Кеш создаётся относительно значения SQL запроса в переменной $this->query

    if ( $allow_cache ) $rows = dle_cache ( "comm_".$allow_cache, $this->query );

    В show.full.php этот запрос формируется со значением

    $where_approve = " AND " . PREFIX . "_comments.approve=1";

    В engine/ajax/comments.php добавлены одинарные кавычки

    $where_approve = " AND " . PREFIX . "_comments.approve='1'";

     

  9. Я-то думаю, чего это все модули посыпались и стали требовать обязательной передачи пустого параметра ShowLoading('')

        if (typeof positiony == 'undefined') {
            var positiony = 'center';
        }
    
        if (typeof message == 'undefined') {
            var positiony = '';
        }

    Два раза positiony вместо message

    • Нравится 1
  10. Пример:

    {custom idexclude="{news-id}" category="1,2,3" limit="10" order="reads"}

    Если открыть не существующую (удалённую) новость, то тег {news-id} не будет обрабатываться из-за проверки defined('NEWS_ID') :

    if( defined( 'NEWS_ID' ) AND !$this->is_custom) $content = str_ireplace( "{news-id}", NEWS_ID, $content );

    В результате в шаблоне будет обработан custom на основании строки:

    {custom idexclude="{news-id}

    А оставшаяся часть строки:

    " category="1,2,3" limit="10" order="reads"}

    будет отображаться как текст.

    • Спасибо 1
  11. 5 часов назад, celsoft сказал:

    Какое есть. Нам нужно было зарезервировать какой то символ. Было принято решение что именно этот.

    Я понимаю причину такого решения. Полагаю в текущей реализации работы с доп.полями это действительно единственный наименее болезненный выход.
    Основная суть посыла в том, что необходимо как-то уведомлять пользователя о запрете использовать запятые, а так же "новое не должно ломать старое".

     

    3 часа назад, aleksandrhristich сказал:

    Второй пункт не логичный какой-то

    Да это просто выдуманный нежизнеспособный пример. Речь не бизнес-логике воображаемого приложения, а о неочевидном для пользователей изменении поведения поля при наличии запятой в списках.

     

    39 минут назад, Gameer сказал:

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

    Будут проблемы при смене символа. Если сейчас `,`, а потом в шаблоне надо будет `/`, то придётся выполнять перестроение всех полей с заменой `,` → `/`. А это как-то не логично и накладно. И опять же, будут проблемы если в значении поля уже используется символ `/`, то получим ту же проблему что и в топике.

     

    Как вариант возможно можно было бы рассмотреть вариант с хранением данных в json формате. Ранее, когда JSON не работал с кириллицей, вариант с кастомным форматом `поле|значение||поле2|значение2` был вполне приемлем. Но сейчас, как мне кажется, использование json будет наиболее приемлемым.
    Это решит многие проблемы и позволит более гибко хранить данные с различными дополнительными параметрами, как у загружаемых изображений к примеру.
    Так же позволит использовать цельные значения доп.полей без необходимости костылить/заменять запятые, например подборки `Про мафию, банды и мошенников`.

    Я уж молчу о файле xfields.txt Он уже давно просится перейти на json формат. Строка вида `||text||1|0|0|0|||0|0||||||||||||||` вызывает лишь отчаяние при попытке понять какие там параметры в ней прописаны.

  12. Нууу, очень спорное решение в данном случае.
    Вообще нигде не указано, что теперь нельзя использовать запятую в списках.
    Человек просто заметил, что поле не сохранилось. Нет никаких ошибок или сообщений при использовании запятой в поле.

    Основная суть проблемы в том, что:
    1. Поменялась логика поведения прежнего функционала даже при выключенной опции мультивыбора.
    2. Нигде не написано, что теперь нельзя использовать запятую в значении поля списка. Оно просто молча перестало работать как было раньше.

     

    Почему я считаю это критической ошибкой.
    Допустим это интернет магазин, в поле "Наличие" прописаны значения:

    Есть, в достаточном количестве
    Есть, под заказ
    Нет, ожидается поставка
    Нет, снято с производства

    При редактировании будет всегда автоматически выбираться первое значение. И если админ не сразу заметит (а он не сразу заметит), то большое количество данных будет утеряно. И придётся немного помучаться, чтобы восстановить данные из бекапа. И будет хорошо, если всё ограничится лишь восстановлением данных...

    • Поддерживаю 1
  13. Проблема связана с добавлением функционала Разрешить выбор нескольких значений
    Значение в списке имеет вид:

    Да, можно

    В /engine/inc/xfields.php теперь все значения списка по умолчанию обрабатываются словно включен мультивыбор и разбиваются по запятой:

    $fieldvalue = explode(',', $fieldvalue);  line: 1178

    Т.е. в БД строка имеет вид:

    field|Да, можно||other|value

    где `Да, можно` – это одно цельное значение. А скрипт обрабатывает его словно это перечень значений.

    В результате чего при каждом редактировании новости слетает выбранное прежде значение.
    В коде идёт сравнение строки `Да, можно` из списка и массива [`Да`, ` можно`]. Что и приводит к некорректному результату.

    in_array($value1[0], $fieldvalue)

     

  14. Если при редактировании/создании RSS информера оставить поле выбора категории пустым, то будет Fatal Error. PHP 8 для функции count() теперь выбрасывает ошибку если ей передан не поддерживаемый тип, в данном случае NULL.

    engine/inc/rssinformer.php

    if( !count( $category ) ) {

     

  15. Не-а. Не указано.

    Цитата

    Максимально допустимый вес изображений, загружаемых для публикаций
    Введите максимальный объём загружаемого изображения (в килобайтах)

    Да и в целом неплохо бы добавить "защиту от дурака".

    К тому же проблема только в файле categories.php. Во всех других файлах этой проблемы нет.

  16. Комментарий удаляется из БД прямым запросом игнорируя параметр древовидных комментариев.

    Получается что если у комментария были ответы, то из поста пропадает вся ветка, хотя комментарии-ответы по факту существуют.

  17. 35 минут назад, celsoft сказал:

    DLE делает все правильно

    Комментарий отправляется на модерцию. Счётчик новости не меняется. Зачем в таком случае чистить кеш?
    engine/modules/addcomments.php
    Перед строкой:

    clear_cache( array( 'news_', 'comm_'.$post_id, $cprefix, 'stats' ) );

    Достаточно добавить код:

    if ($where_approve)

    И обратите внимание на п.2. При подтверждении комментария через AJAX обработчик не очищается кеш комментариев новости.

     

    PS. И ещё, чтобы отдельную тему не создавать. Пользователь с именем `noname` проклят невозможностью выставлять оценки в рейтинге.
    Все гости записываются в таблицу `dle_logs` и `dle_comment_rating_log` под именем `noname`.
    Может будет правильнее для гостей записывать NULL или хотя бы пустую строку в качестве имени?

  18. Проблемы с очисткой кеша.

    1. При добавлении коммента, который уходит на модерацию – всё равно чистится кеш. Самое плохое что чистится кеш всего контента – `news_`

    2. При ajax подтверждении комментария – излишне чистится почти весь кеш всего сайта, кроме того который реально необходимо чистить – `'comm_' . $post_id`

  19. В админке в расширенном поиске новостей добавить возможность поиска по исключению.
    К примеру – найти все новости где доп.поле НЕ содержат строку poster|

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

    Содержит
    Не содержит
    Строго равно
    Начинается на
    Начинается НЕ на
    Заканчивается на
    Заканчивается НЕ на

     

    • Нравится 1
    • Поддерживаю 1
  20. При массовом подтверждении комментариев если случайно обновить страницу и подтвердить повторную отправку формы, то в новостях будет повторно увеличен счётчик comm_num+1
    Не выполняется проверка на существование комментария и находится ли он на модерации.

  21. Парочка предложений по утилите управления плагинами.

    1. Есть параметр `Обязательное наличие плагина`. Но он поддерживает только один плагин. А иногда когда делаешь комплексную систему – идёт связка из нескольких отдельных модулей. Идеальным вариантом было бы использование чего-то подобного конфигурационному файлу composer-а, например что-то примитивное типа:

    {
    	"name": "Sandev\CurrentModName",
    	"require": {
    		"php": "^7.1 || 8.1",
    		"dle": ">=14.2 && <16.0",
    		"Sandev\RequiredModule": "*",
    		"Sandev\AnotherRequiredModule": "*",
    	}
    }

    А если сюда ещё добавить и autoload-psr4, то будет вообще сказка.

    2. На странице списка плагинов сделать поиск на JS, чтобы был без перезагрузки страницы.
    А если развить тему из п.1, то было бы очень удобна организация быстрого поиска по vendor-у. Выводить список авторов на подобии облака тегов.

    3. На страницу плагина добавить все элементы управления плагином, а не только "Сохранить". Это прям вот вообще необходимо.

    4. В списке плагинов добавить обычную ссылку на страницу редактирования плагина, чтобы можно было открыть редактирование плагина в новом окне.

    Комментарий по п.3 и п.4: Заходишь на незнакомый сайт, нужно выполнить оптимизацию. А там 50+ плагинов и часть из них имеют имена `rate fav img`, `JS скрипты`, `Новое` и т.п. Приходится открывать плагин, смотреть что там, потом возвращаться назад, вновь искать этот плагин в огромном списке чтобы выполнить любое действие над ним кроме сохранения. Это жутко неудобно.

    И незначительный багрепорт. Если первый в списке плагин переместить вниз, то у него не будет верхней кромки из-за наличия класса `no-border-top`. Странно зачем вообще так сделано если можно просто стилями всё оформить:

    .table tbody tr + tr td {border-top: 1px solid:#ccc}

     

  22. На почту отправляется одноразовая ссылка для восстановления пароля, при переходе по которой удаляется запись из БД и повторно воспользоваться ею нет возможности.
    Некоторые почтовые сервисы самостоятельно выполняют переход по ссылке (для проверки на вирусы или ещё с какой-то своей целью), в результате чего пользователь имеет не рабочую ссылку восстановления.

    PS. Простое решение, добавляется проверка IP адреса, чтобы страница сброса пароля работала только если её открыл тот же IP адрес с которого выполнялся запрос на восстановление.
    https://github.com/San-Dev/dle-plugins/blob/master/lostpassword-by-ip.xml

    • Нравится 3
  23. 18 часов назад, celsoft сказал:

    При использовании где? DLE нигде вообще не использует DIRECTORY_SEPARATOR поэтому почему он вдруг его должен как то заменять?

    Да, в движке сейчас нигде не используется. Но ведь система создана для плагинов, вот про них и речь.
    Взять тот же /engine/classes/composer/vendor/composer/ClassLoader.php в нём эта константа используется.

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

    PS. Проблема возникла в самописном автозагрузчике классов.

×
×
  • Создать...