24.08.2019, 13:19
|
|
Профессор
|
|
Регистрация: 06.08.2017
Сообщений: 473
|
|
Внутри code выводятся юникод значения
У меня всплыла такая проблема - внутри тега <code>...</code> выводятся юникод значения для ряда символов:
& → &
' → #039; (вначале амперсанд)
" → "
< → <
> → >
Происходит это не на всей странице, а только в комментариях.
Может есть css-свойство которое принудительно отобразит нормальные символы, а не эти значения для символов?
Или в чём тут может быть проблема?
Комментарии добавляются из поля textarea. Кодировка у страницы прописана utf-8. В тексте эти символы отображаются нормально, а внутри тега <code> выводятся значения.
При редактировании комментария, в поле textarea опять же выводятся вместо символов их значения.
Кто нибудь сталкивался с таким? Есть ли решение этой проблемы?
|
|
24.08.2019, 15:58
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
Не используй innerHTML\html().
__________________
29375, 35
|
|
25.08.2019, 20:47
|
|
Профессор
|
|
Регистрация: 06.08.2017
Сообщений: 473
|
|
Тут такая заморочка, комментарии выводятся через php.
А на уровне скрипта, значения из textarea как берутся, так и вставляются через метод value:
let txt = textarea.value;
Это неправильно?
|
|
26.08.2019, 07:34
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
MC-XOBAHCK,
это не юникод, а html сущности, и коли они приходят с сервера, то на сервере и происходит - htmlspecialchars. С другой стороны - попробуйте в тег code вставить html код без преобразований < и >, и не получится отобразить код.
|
|
26.08.2019, 10:40
|
|
Профессор
|
|
Регистрация: 06.08.2017
Сообщений: 473
|
|
Сообщение от laimas
|
попробуйте в тег code вставить html код без преобразований < и >, и не получится отобразить код.
|
Да, я знаю что без преобразований браузер отработает всё что внутри code как обычный html. Прежде чем вставить код в pre code - его нужно преобразовать, заменив ряд символов. Это я понимаю, а в терминологии как видите не силён, процесс замены символов на сущности называю экранированием, что наверное не правильно.
Вот и спрашиваю может кто сталкивался с таким что внутри code выводятся эти сущности (значения), а не их символы. Возможно этому есть решение.
Преобразование идёт средствами laravel, при получении ajax-запроса (это комментарии на сайте).
|
|
26.08.2019, 10:56
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от 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.
|
|
26.08.2019, 12:17
|
|
Профессор
|
|
Регистрация: 06.08.2017
Сообщений: 473
|
|
Покажу всё в скринах.
Вот скрин как это выводится, где видно проблему:
Скрин из БД значение оригинала комментария (с синтаксисом Markdown):
Скрин - значение в ячейке с html:
|
|
26.08.2019, 12:20
|
|
Профессор
|
|
Регистрация: 06.08.2017
Сообщений: 473
|
|
Вот же блин. Теперь на скринах вижу что амперсанд внутри pre code каким то образом из сущности символа (все сущности начинаются с амперсанда) ещё раз компильнулся в сущность амперсанда. Вот поэтому у меня такая лажа.
Блин, блин, блин... У меня с регулярками в js не очень, а тут нужно в php как то теперь придумывать решение. Блин...
|
|
26.08.2019, 12:28
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Если вы будете в базе держать преобразованное в сущности, то это уже проблема. А вот при выводе в клиента такое преобразование требуется, конечно если не требуется вывод HTML.
Но, все же происходит на уровне браузера, никаких querySelector('...) не требуется (кстати, это ошибка синтаксиса). Вот код:
<textarea>< & ></textarea>
Тем не менее в текстовом поле отображаться будет < & >, и если сделать вставку этого значения в тег code, а затем вывести из тега как replace(/&/, '&'), то результатом будет < & >, а никак не &lt; & &gt;
Вы действительно запутались в чем-то.
|
|
26.08.2019, 12:48
|
|
Профессор
|
|
Регистрация: 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.
|
|
|
|