Урок 17. PHP — htmlentities

Всякий раз, когда вы позволяете вашим пользователям отправлять текст на ваш сайт (имя, логин, пароль или любая другая информация), вы должны быть осторожны. Нужно быть уверенным, что у вас нет дыр в безопасности сайта, которые злоумышленники могут использовать для взлома. Если все же нужно получать от пользователя данные, то обязательно используйте функцию htmlentities, чтобы предотвратить запуск HTML-кода или скриптов, которые могут быть вредны и опасны!

PHP — Преобразование HTML тегов

Htmlentities функция принимает строку и возвращает ту же строчку, но уже с преобразованными HTML тегами.

Например, строка "<script>" будет преобразована в "&lt;script&gt;".

Путем преобразования символов < и > в сущности, она не дает браузеру выполнить текст как скрипт.

Это может показаться немного сложным, но если вы подумаете, как работает браузер, то становится понятнее. Проще говоря, данная функция обрезает или преобразует некоторые служебные символы, чтобы они уже не воспринимались браузером или сервером как исполняемый скрипт, а виделись ему как обычный текст. Давайте посмотрим, как функция htmlentities изменяет данные.

//Пользователь отправляет нам данные и надеется перенаправить нам на свой сайт
$userInput = "Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!
	<script type='text/javascript'>
	window.location = 'https://www.example.com/'
	</script>'";
	
//Но мы это предусмотрели и использовали htmlentities
$userInputEntities = htmlentities($userInput);

//И теперь без опасений используем присланные данные
echo $userInputEntities;

В результате, ничего страшного не произойдет, а все присланные пользователем данные преобразованы в безопасные:

Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!
	&lt;script type='text/javascript'&gt;
	window.location = 'https://www.example.com/'
	&lt;/script&gt;'

Обломали нашего юного хакера :D

Когда нужно использовать htmlentities?

Всегда, когда вы позволяете пользователям отправлять контент на ваш сайт. Да, лучше ограничить пользователей в возможности использования HTML тегов, зато не рисковать безопасностью своего сайта. Иногда все таки требуется предоставить им некоторые теги для форматирования своего текста, например, выделение жирным шрифтом и так далее, но это выходит за рамки данного урока, может быть поговорим об этом позже.

Помните, что когда вы позволяете посетителям отправлять данные на ваш сайт, вы также предоставляете им доступ к нему. Так что убедитесь, что вы приняли соответствующие меры предосторожности.

POST и GET | Содержание | Файлы

Комментарии:

  1. Андрей — 04.02.2013 15:14

    3дравствуйте, решил попробывать с htmlentities
    но он выдал не такой текст как у вас в примере а
    СмоÑ┌Ñ─иÑ┌е, Ñ│ейÑ┤аÑ│ Ñ▐ пеÑ─енапÑ─авлÑ▌ ваÑ│ на example.com! ХаÑ┘аÑ┘а! window.location = ‘http://www.example.com/’ ‘
    Какую кодировку нужно поставить или что нужно сделать что бы текст отображался нормально?

  2. myblaze 04.02.2013 16:40

    Кодировку всегда ставлю UTF-8 без BOM с помощью Notepad++

  3. Андрей — 04.02.2013 16:56

    Сделал как вы сказали, всё так же, и в настройках сайта в файле .htaccess прописал AddDefaultCharset utf-8
    и в самом файле писал

    Страница с примером передачи переменных с помощью Get

    <?php
    //Пользователь отправляет нам данные и надеется перенаправить нам на свой сайт
    $userInput = "Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!

    window.location = ‘http://www.example.com/’
    ‘»;

    //Но мы это предусмотрели и использовали htmlentities
    $userInputEntities = htmlentities($userInput);

    //И теперь без опасений используем присланные данные
    echo $userInputEntities;

    ?>

  4. Андрей — 04.02.2013 16:57

    ой, не то скопипастил, кароче вот эту строчку добавлял

  5. Андрей — 04.02.2013 16:57

    meta http-equiv=»Content-Type» content=»text/html; charset=utf-8

  6. myblaze 04.02.2013 20:56

    И помогло?

  7. Андрей — 04.02.2013 21:04

    Нет((

  8. Александр — 08.02.2013 18:46

    Андрей, а кодировка самого скрипта какая? Поставьте notepad++ и посмотрите в правый-нижний угол. Там будет написано либо ANSI (что соответствует нашему Windows-1251), либо UTF-8. Нужно чтобы то что в meta соответствовало тому, что там написано.

    Для преобразования из одной кодировки в другую зайдите в «кодировки» в notepad++ и выберите «преобразовать в…» а там что вам надо.

  9. Андрей — 09.02.2013 21:11

    Всё ровно не работает((

  10. Александр — 10.02.2013 14:11

    Андрей, если кодировка в файле (в notepad++ смотрите — повторюсь), кодировка в теге или просто , а так же кодировка в самом браузере совпадает, то проблем быть не может в принципе.

    Проверьте ещё раз чтобы кодировки были идентичны: в браузере, в meta, и в самом файле скрипта. Наверняка где-то что-то не то.

    Попробуйте поставить phpStorm и там в окне дебаггера посмотрите какой текст возвращает скрипт.

    Лично у меня изначально пробные скрипты которые я для себя писал были в windows-1251, и когда я начал писать русские символы то начались баги в браузере с ней. Поставил кодировку utf-8 в плюсплюсе и вместо русских символов появились крякозябры. Вернул всё в зад и сделал не просто ВИД кодировки, а именно ПЕРЕКОДИРОВАЛ файл в utf-8 и всё стало на свои места.

  11. Александр — 10.02.2013 14:12

    тут теги режутся, короче в meta (по ссылке тут http://htmlbook.ru/html/meta/content) должна обязательно стоять кодировка как в файле.

  12. Руслан — 22.02.2013 13:52

    А не лучше ли при работе с кириллицей использовать htmlspecialchars?

  13. myblaze 22.02.2013 16:02

    Руслан, можно попробовать, она, в отличие от htmlentities, поменьше сущностей преобразует. Однако даже с htmlentities не должно быть проблем с кириллицей.

  14. Александр — 22.03.2013 16:05

    Ещё два workaround’а с кодировкой тут отпишу. На самом деле один из них даже не костыль, а реальное применение.

    1) Попробуйте перед выполнением скрипта выполнить такую функцию:
    header(«Content-Type: text/html; charset=UTF-8»);

    2) В настройках apache в корневой .htaccess запихнуть директиву AddDefaultCharset UTF-8
    отдельной строкой

  15. Stas — 24.08.2013 11:50

    Алехсандыр, если у тебя текс был в какойто Жопошной кодировке, то смени в Notepad++ кодировку на UTF-8 или на какую тебе надо и просто перепиши текст сначала, у меня тож такое было, в браузере в место «браузер» показывало «%Dj%.mwa%D%%» ну всякую хрень кароче, поменял кодировку на UTF-8 тоже самое. Потом решил переписать текст заново но уже в кодировке UTF-8 И все получилось!) советую и тебе так сделать)

  16. Firik — 22.10.2014 14:06

    если использовать так
    $userInputEntities = htmlentities(strip_tags($userInput), ENT_QUOTES, «cp1251»);
    то на выходе
    Смотрите, сейчас я перенаправлю вас на example.com! Хахаха! window.location = ‘http://www.example.com/’ ‘
    если использовать как в задании, то теги не меняются вообще. в чем проблема?

  17. Twister — 23.03.2015 15:21

    правильнее:
    $userInputEntities = htmlentities ($userInput, ENT_QUOTES, ‘UTF-8’);

  18. Алексей — 26.07.2015 14:35

    Вообще ничего не понял… куда хакер будет писать эти данные?
    $userInput = «Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!

    window.location = ‘http://www.example.com/’
    ‘»;

  19. Алексей — 26.07.2015 14:43

    пробовал вставлять в поле «Укажите ваше имя», нажал «передать информацию», згружается та же страница index.php? только имя пустое и все, функцию Htmlentities не использовал…

  20. Антон — 27.09.2016 08:54

    верх: «»

    и сабж: «$userInputEntities = htmlentities ($userInput, ENT_QUOTES, «UTF-8″);»

    в двойных кавычках UTF-8, это критично )

  21. keke — 24.10.2016 19:52

    А что лучше использовать htmlentities или htmlspecialchars???

  22. Юрий — 27.03.2022 13:15

    echo htmlentities(htmlentities($str)); -Вот правильное решение

  23. Юрий — 27.03.2022 13:20

    Применительно к примеру из этого сайта правильный, работающий код такой:
    $userInputEntities = htmlentities($userInput);
    echo htmlentities($userInputEntities);

Добавить комментарий