Мой Telegram канал 👉 https://t.me/agoalofalife_channel
С появлением мобильных мессенджеров использование эмодзи стало неотъемлемой частью нашей жизни. Однако разработчикам приходится сталкиваться с необходимостью обработки текста, который может содержать эмодзи, например, при генерации аватарок на основе имени пользователя. Если имя содержит эмодзи, это может вызвать нежелательное поведение в процессе обработки.
При поиске способов удаления эмодзи из строки на PHP часто можно натолкнуться на подобное решение:
function remove_emoji($string)
{
// Match Enclosed Alphanumeric Supplement
$regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u';
$clear_string = preg_replace($regex_alphanumeric, '', $string);
// Match Miscellaneous Symbols and Pictographs
$regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';
$clear_string = preg_replace($regex_symbols, '', $clear_string);
// Match Emoticons
$regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';
$clear_string = preg_replace($regex_emoticons, '', $clear_string);
// Match Transport And Map Symbols
$regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';
$clear_string = preg_replace($regex_transport, '', $clear_string);
// Match Supplemental Symbols and Pictographs
$regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u';
$clear_string = preg_replace($regex_supplemental, '', $clear_string);
// Match Miscellaneous Symbols
$regex_misc = '/[\x{2600}-\x{26FF}]/u';
$clear_string = preg_replace($regex_misc, '', $clear_string);
// Match Dingbats
$regex_dingbats = '/[\x{2700}-\x{27BF}]/u';
$clear_string = preg_replace($regex_dingbats, '', $clear_string);
return $clear_string;
}
Хотя этот метод работает, он требует постоянного обновления диапазонов символов Unicode и может быть неэффективным в долгосрочной перспективе.
Однако существует более простое и элегантное решение, основанное на использовании регулярных выражений:
use Illuminate\Support\Str;
$text = Str::of("Сегодняшний ужин был просто восхитителен! 🍕🍣🍰")
->replaceMatches('/[^\p{L}\p{N}\p{Z}\p{P}]/u', '');
Давайте разберем, что делает это регулярное выражение по частям:
\p{L}
: Unicode-класс символов, соответствующий любой букве.\p{N}
: Unicode-класс символов, соответствующий любой цифре.\p{Z}
: Unicode-класс символов, соответствующий любому разделителю (пробел, табуляция и т.д.).\p{P}
: Unicode-класс символов, соответствующий любому знаку пунктуации.Таким образом, удаляются символы, не являющиеся буквой, цифрой, пробелом или знаком пунктуации. Это означает удаление всех символов, которые не являются частью обычного текста, включая эмодзи.
Телеграм канал где я публикую все самое интересное из разработки и там куча emoji 😎
Мой Telegram канал 👉 https://t.me/agoalofalife_channel
В старых приложениях на PHP часто используются встроенные функции безопасности, такие как strip_tags()
, htmlspecialchars()
и htmlentities()
. Каждая из них работает по-разному, но насколько они действительно безопасны для использования? И когда следует использовать каждую из них?
Давайте рассмотрим функцию strip_tags()
и, надеюсь, найдем ответы на эти вопросы! Согласно документации PHP:
Функция пытается возвратить строку, из которой удалены все NULL-байты, HTML- и PHP-теги из заданной строки (string). Для удаления тегов используется тот же механизм, что и в функции fgetss().
Сама функция имеет два параметра: первый обязателен и представляет собой строковое значение, из которого происходит удаление, а второй – необязательный список разрешенных HTML-тегов.
strip_tags(string $string, array|string|null $allowed_tags = null): string
Давайте ответим на этот вопрос через несколько примеров…
return strip_tags("Hello <b>World</b>!")
// Hello World!
✅ Пока все хорошо, она делает то, что должна – удаляет HTML-теги из строк!
return strip_tags("Hello <img src=x onerror=\"alert('Boom!')\"> World!");
// Hello World!
✅ Как и ожидалось, она удаляет сложные теги тоже.
$string = "Hello <img src=x onerror=\"alert('Boom!')\"> World!";
return strip_tags($string, "<img>");
// Hello <img src=x onerror="alert('Boom!')"> World!
❌ К сожалению, она слепо разрешает весь тег, что включает любые XSS-полезные нагрузки. Вы не можете использовать strip_tags()
с пользовательским вводом, когда хотите разрешить некоторые теги. Вместо этого вам нужен полнофункциональный HTML Purifier.
$value = strip_tags("' onload=\"alert('Boom!')\" '");
return "<input type='text' name='comments' value='{$value}'>";
// <input type='text' name='comments' value='' onload="alert('Boom!')" ''>
❌ Как мы и ожидали, функция не учитывает контекст, хотя она удалит теги, она не ничего не экранирует. Это означает, что использование её внутри атрибутов тегов не безопасно.
Функция strip_tags()
безопасна для использования, когда вы удаляете исключительно HTML-теги из контента, идущего прямо на страницу вне любых атрибутов или сложных HTML-структур.
Не используйте ее, если вам нужно разрешить определенные теги (вместо этого используйте Purifier), и не используйте внутри атрибутов или сложных структур.
Перевод статьи: https://securinglaravel.com/p/security-tip-is-strip_tags-secure
Еще что нибудь почитать? тогда присоединяйся в нашу ламповую компанию в телеге
{message}