PHP htmlentities недостаточно, чтобы остановить хакеров, вводящих html из формы

У меня есть форма с текстовым полем, которое отправляет данные в файл php, который использует функцию "htmlentities", чтобы сделать ее безопасной для электронной почты владельцу веб-сайта.

Проблема заключается в том, что кому-то удалось получить гиперссылку в тексте, а htmlentities() не удаляет ее.

Это мое текстовое поле html:

<input name="usertext" type="text" />

Это мой PHP-код, который получает почтовые данные (я оставил код электронной почты из-за того, что это не проблема). Я изменил его, чтобы просто повторить полученные данные, чтобы попытаться воспроизвести то, что сделал хакер. он сделал это, я могу найти способ остановить его от происходящего):

echo trim(htmlentities($_POST["usertext"], ENT_QUOTES));

Теперь хакер отправляет некоторые данные, и это был результат html (исходный код - это означает, что он показывал обычную ссылку в браузере):

<a target="_blank" href="mailto:[email protected]">[email protected]</a>

Я думал, что htmlentities() всегда будет препятствовать тому, чтобы кто-либо мог вводить html любого типа. Если я введу гиперссылку, например:

<a href="aaa" />

Я получаю:

&lt;a href="aaa" /&gt;

Но хакерский текст не был закодирован так.

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

  • Как хакер ввел теги html, чтобы функция htmlentities() ничего не сделала для него?
  • Как я могу его повторить для тестирования? (на этот вопрос может ответить ответ)

Я провел некоторое исследование, и, возможно, хакер закодировал его текст в utf-7 или что-то в этом роде?

Я уже получил несколько писем с этими же ссылками. Этот хакер, очевидно, тестирует мой сайт, чтобы узнать, может ли он сделать XSS или что-то в этом роде.

Ответ 3

Это не самое элегантное решение, но, не видя остальной части вашего кода, вы можете проверить, содержит ли поле usertext строку "href" и отрицает ее.

Ответ 4

Будет ли htmlspecialchars() делать трюк? Эта статья в W3Schools, похоже, предполагает, что.