Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.08.2019, 13:19
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Внутри code выводятся юникод значения
У меня всплыла такая проблема - внутри тега <code>...</code> выводятся юникод значения для ряда символов:
& → &amp;
' → #039; (вначале амперсанд)
" → &quot;
< → &lt;
> → &gt;

Происходит это не на всей странице, а только в комментариях.

Может есть css-свойство которое принудительно отобразит нормальные символы, а не эти значения для символов?
Или в чём тут может быть проблема?

Комментарии добавляются из поля textarea. Кодировка у страницы прописана utf-8. В тексте эти символы отображаются нормально, а внутри тега <code> выводятся значения.
При редактировании комментария, в поле textarea опять же выводятся вместо символов их значения.

Кто нибудь сталкивался с таким? Есть ли решение этой проблемы?
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2019, 15:58
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Не используй innerHTML\html().
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 25.08.2019, 20:47
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Тут такая заморочка, комментарии выводятся через php.
А на уровне скрипта, значения из textarea как берутся, так и вставляются через метод value:
let txt = textarea.value;

Это неправильно?
Ответить с цитированием
  #4 (permalink)  
Старый 26.08.2019, 07:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

MC-XOBAHCK,
это не юникод, а html сущности, и коли они приходят с сервера, то на сервере и происходит - htmlspecialchars. С другой стороны - попробуйте в тег code вставить html код без преобразований < и >, и не получится отобразить код.
Ответить с цитированием
  #5 (permalink)  
Старый 26.08.2019, 10:40
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сообщение от laimas Посмотреть сообщение
попробуйте в тег code вставить html код без преобразований < и >, и не получится отобразить код.
Да, я знаю что без преобразований браузер отработает всё что внутри code как обычный html. Прежде чем вставить код в pre code - его нужно преобразовать, заменив ряд символов. Это я понимаю, а в терминологии как видите не силён, процесс замены символов на сущности называю экранированием, что наверное не правильно.

Вот и спрашиваю может кто сталкивался с таким что внутри code выводятся эти сущности (значения), а не их символы. Возможно этому есть решение.

Преобразование идёт средствами laravel, при получении ajax-запроса (это комментарии на сайте).
Ответить с цитированием
  #6 (permalink)  
Старый 26.08.2019, 10:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от MC-XOBAHCK
внутри code выводятся эти сущности (значения), а не их символы.
Сами они не появятся там:

<code></code>
<textarea>< & ></textarea>

<script>
document.querySelector('code').textContent = document.querySelector('textarea').value;
alert(document.querySelector('code').textContent.length);
</script>


Тоже самое будет и при вставке как html. Ищите там, где производится преобразование (на сервере), убирайте его. Но сервер такое делает при выводе не потому, что так красиво, а для того чтобы предотвратить XSS атаку, так что смотрите и анализируйте.

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

Последний раз редактировалось laimas, 26.08.2019 в 11:05.
Ответить с цитированием
  #7 (permalink)  
Старый 26.08.2019, 12:17
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Покажу всё в скринах.
Вот скрин как это выводится, где видно проблему:


Скрин из БД значение оригинала комментария (с синтаксисом Markdown):


Скрин - значение в ячейке с html:
Ответить с цитированием
  #8 (permalink)  
Старый 26.08.2019, 12:20
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Вот же блин. Теперь на скринах вижу что амперсанд внутри pre code каким то образом из сущности символа (все сущности начинаются с амперсанда) ещё раз компильнулся в сущность амперсанда. Вот поэтому у меня такая лажа.

Блин, блин, блин... У меня с регулярками в js не очень, а тут нужно в php как то теперь придумывать решение. Блин...
Ответить с цитированием
  #9 (permalink)  
Старый 26.08.2019, 12:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Если вы будете в базе держать преобразованное в сущности, то это уже проблема. А вот при выводе в клиента такое преобразование требуется, конечно если не требуется вывод HTML.

Но, все же происходит на уровне браузера, никаких querySelector(&#039...) не требуется (кстати, это ошибка синтаксиса). Вот код:

<textarea>&lt; &amp; &gt;</textarea>


Тем не менее в текстовом поле отображаться будет < & >, и если сделать вставку этого значения в тег code, а затем вывести из тега как replace(/&/, '&amp;'), то результатом будет < &amp; >, а никак не &amp;lt; &amp; &amp;gt;
Вы действительно запутались в чем-то.
Ответить с цитированием
  #10 (permalink)  
Старый 26.08.2019, 12:48
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

laimas, я это понимаю. Я так понял вы увидели на последнем скрине в последней строчке что происходит. Это не я, это laravel такое сделал.
Я в php из маркдауна в html компилирую такой строкой:
comment_html = Markdown::parse($comment);

В js никаких replace я не делаю. Проблема наверное в том, что $comment я получаю из ajax-запроса, при этом происходит замена символов на сущности для защиты от XSS-атак.
Второй раз, наверное, замена символов на сущности происходит при компиляции из маркдауна в хтмл. В общем, нужно пересмотреть код сохранения комментария в БД, чтоб два раза не того.
Спасибо за помощь!

Последний раз редактировалось MC-XOBAHCK, 26.08.2019 в 12:50.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача значения внутри тега <label> на сервер при помощи AJAX MaksimZykov AJAX и COMET 4 22.10.2018 09:51
Как при клике использовать предыдущее значения переменной внутри функции akagloomy jQuery 7 29.01.2015 00:37
Подскажите как лучше положить .xml документ в базу Гробовщик Серверные языки и технологии 4 02.09.2013 11:15
Получение значения переменной внутри обработчика события jQuery Mbenga Общие вопросы Javascript 2 01.07.2013 10:57
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37