Вопрос: я хочу из обычных смайлов преобразовать их в emoji apple. Я это сделал, но здесь вопрос про безопасность. Я использую laravel и в html вывожу {{ toEmoji($text) }}, возвращается текст с тегами "img", и смайлы конечно не отображаются. Если вывожу {!! toEmoji($text)!!}, то всё ок, но так можно отправить js код, и он отработает.
Как вообще правильно экранировать? Или нужно как-то код сохранять в БД на этапе получения текста, если да, то как это делается? У вк есть смайлы и там всё хорошо работает, всякий JS не пропускает, а смайлы отображает.
Я конечно не эксперт в этом вопросе
Но попробуйте перед сохранением данных в бд чистить их от нежелательных тегов вместе с содержимым и от нежелательных атрибутов
Можно, конечно, чистить код от определенных тегов и атрибутов. Но это не совсем хороший путь. Сегодня есть атрибут onclick, который вы успешно вырезаете, а завтра изобретут новый атрибут doubleclick, а через код - tripleclick. И каждый раз вам нужно будет допиливать свой парсер.
Лучше подойти к вопросу кардинально - сделать белый список тегов и их атрибутов. А всё остальное вырезать без жалости. Правда, для этого вам придётся распарсить код полностью, а потом запарсить обратно (пропуская лишь разрешенное). Написать такой парсер чуть сложнее, но оно того стоит.
А что значит "Правда, для этого вам придётся распарсить код полностью, а потом запарсить обратно (пропуская лишь разрешенное). " - распарсить и запарсить?
Напишите свой велосипед, это не сложно.
Несколько функций, которые рекурсивно вызывают друг друга, формируя структуру документа в процессе парсинга. В нераспарсенных кусках просто экранируем символы, в том числе < и >. Потом склеиваем всё вместе.