PHP - защита полного HTML-файла пользователя от XSS - PullRequest
0 голосов
/ 08 ноября 2019

В настоящее время я работаю над веб-сайтом по созданию шаблонов электронной почты на PHP (если быть точным, LAMP), который позволяет пользователям вставлять свой код электронной почты в формате HTML, а затем отправлять его своим клиентам.

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

ЭтиВот решения, которые я нашел, и почему они не работают для меня:

HTMLPurifier :

Я думаю, что это очевидный выбор для большинства, потому что он имеет лучшую безопасностьи соответствует отраслевым стандартам. Хотя предполагается, что основное его использование предназначено для HTML-фрагментов / небольших фрагментов, я решил попробовать.

Первая проблема, с которой я столкнулся, заключалась в том, что теги head (и все, что внутри них) получалораздели и удалили. Заголовок очень важен в электронных письмах в формате HTML, поэтому мне пришлось найти способ обойти это ... к сожалению, единственное исправление, которое я смог найти, - это отделить заголовок от остальной части письма и запускать каждую часть отдельно через HTMLPurifier.

Я еще не попробовал это, потому что это кажется очень хакерским, но, похоже, это единственный способ достичь того, чего я хочу. Я также не уверен, насколько хорошо HTMLPurifier находит XSS в CSS. Вдобавок ко всему, он не очень хорош с точки зрения производительности, так как является такой большой библиотекой.

HTMLawed:

HTMLawed казался еще одним великимвариант, но некоторые вещи отговорили меня от его использования.

A) По сравнению с HTMLPurifier, это кажется менее безопасным. У HTMLawed есть несколько задокументированных проблем безопасности на данный момент. Он также еще не получил широкого распространения, что вызывает больше беспокойства (его используют только около 10 зарегистрированных компаний).

B) Он выпущен по лицензии GPL / GPU, что фактически означает, что я не могу использовать его на своем веб-сайте, еслиЯ готов позволить людям пользоваться моим сервисом бесплатно.

C) Из того, что я видел, люди говорили об этом, похоже, он удаляет много тегов, если он не настроен сильно. Я не могу много сказать здесь, потому что я не пробовал это, но это также вызывает проблемы безопасности для меня - что, если я что-то пропущу? Что делать, если я не могу настроить его, чтобы сохранить элементы, которые я хочу? и т. д.


Это мои вопросы к вам:

  1. Есть ли лучшие альтернативы перечисленным выше?
  2. Возможно ли это закодироватья или это слишком амбициозно и слишком небезопасно?
  3. Как крупные почтовые компании решают эту проблему (mailchimp, activecampaign, sendinblue и т. д.)?

1 Ответ

0 голосов
/ 08 ноября 2019

Кажется, вы отправляете контент HTML. Тогда вы не можете их фильтровать. Вы должны хранить HTML в вашей базе данных. Если вы отфильтруете их, используя XSS-подтверждение, HTML-код не будет работать должным образом. По умолчанию все службы веб-почты, отключающие Javascript по умолчанию, такие как GMail, Yahoo, Roundcube и т. Д.

Если вы используете WYSIWYG, как CKEditor, он автоматически удаляет все теги <script>, а также некоторые неизвестные атрибуты. Но, тем не менее, вы можете указать, что принимать и что удалять, используя CKEditor.config().

. Если ваш PHP не может быть вставлен в вашу базу данных из-за некоторых специальных символов, то вы можете использовать оператор подготовки SQL или кодировать ваш HTML. введите в base64, используя base64_encode(), затем расшифруйте его, когда использовать в mail() или PHPMailer::Body.

...