Урок 17. PHP — htmlentities
Всякий раз, когда вы позволяете вашим пользователям отправлять текст на ваш сайт (имя, логин, пароль или любая другая информация), вы должны быть осторожны. Нужно быть уверенным, что у вас нет дыр в безопасности сайта, которые злоумышленники могут использовать для взлома. Если все же нужно получать от пользователя данные, то обязательно используйте функцию htmlentities, чтобы предотвратить запуск HTML-кода или скриптов, которые могут быть вредны и опасны!
PHP — Преобразование HTML тегов
Htmlentities функция принимает строку и возвращает ту же строчку, но уже с преобразованными HTML тегами.
Например, строка "<script>" будет преобразована в "<script>".
Путем преобразования символов < и > в сущности, она не дает браузеру выполнить текст как скрипт.
Это может показаться немного сложным, но если вы подумаете, как работает браузер, то становится понятнее. Проще говоря, данная функция обрезает или преобразует некоторые служебные символы, чтобы они уже не воспринимались браузером или сервером как исполняемый скрипт, а виделись ему как обычный текст. Давайте посмотрим, как функция htmlentities изменяет данные.
//Пользователь отправляет нам данные и надеется перенаправить нам на свой сайт $userInput = "Смотрите, сейчас я перенаправлю вас на example.com! Хахаха! <script type='text/javascript'> window.location = 'https://www.example.com/' </script>'"; //Но мы это предусмотрели и использовали htmlentities $userInputEntities = htmlentities($userInput); //И теперь без опасений используем присланные данные echo $userInputEntities;
В результате, ничего страшного не произойдет, а все присланные пользователем данные преобразованы в безопасные:
Смотрите, сейчас я перенаправлю вас на example.com! Хахаха! <script type='text/javascript'> window.location = 'https://www.example.com/' </script>'
Обломали нашего юного хакера :D
Когда нужно использовать htmlentities?
Всегда, когда вы позволяете пользователям отправлять контент на ваш сайт. Да, лучше ограничить пользователей в возможности использования HTML тегов, зато не рисковать безопасностью своего сайта. Иногда все таки требуется предоставить им некоторые теги для форматирования своего текста, например, выделение жирным шрифтом и так далее, но это выходит за рамки данного урока, может быть поговорим об этом позже.
Помните, что когда вы позволяете посетителям отправлять данные на ваш сайт, вы также предоставляете им доступ к нему. Так что убедитесь, что вы приняли соответствующие меры предосторожности.
← POST и GET | Содержание | Файлы →
Комментарии:
3дравствуйте, решил попробывать с htmlentities
но он выдал не такой текст как у вас в примере а
СмоÑ┌Ñ─иÑ┌е, Ñ│ейÑ┤аÑ│ Ñ▐ пеÑ─енапÑ─авлÑ▌ ваÑ│ на example.com! ХаÑ┘аÑ┘а! window.location = ‘http://www.example.com/’ ‘
Какую кодировку нужно поставить или что нужно сделать что бы текст отображался нормально?
Кодировку всегда ставлю UTF-8 без BOM с помощью Notepad++
Сделал как вы сказали, всё так же, и в настройках сайта в файле .htaccess прописал AddDefaultCharset utf-8
и в самом файле писал
Страница с примером передачи переменных с помощью Get
<?php
//Пользователь отправляет нам данные и надеется перенаправить нам на свой сайт
$userInput = "Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!
window.location = ‘http://www.example.com/’
‘»;
//Но мы это предусмотрели и использовали htmlentities
$userInputEntities = htmlentities($userInput);
//И теперь без опасений используем присланные данные
echo $userInputEntities;
?>
ой, не то скопипастил, кароче вот эту строчку добавлял
meta http-equiv=»Content-Type» content=»text/html; charset=utf-8
И помогло?
Нет((
Андрей, а кодировка самого скрипта какая? Поставьте notepad++ и посмотрите в правый-нижний угол. Там будет написано либо ANSI (что соответствует нашему Windows-1251), либо UTF-8. Нужно чтобы то что в meta соответствовало тому, что там написано.
Для преобразования из одной кодировки в другую зайдите в «кодировки» в notepad++ и выберите «преобразовать в…» а там что вам надо.
Всё ровно не работает((
Андрей, если кодировка в файле (в notepad++ смотрите — повторюсь), кодировка в теге или просто , а так же кодировка в самом браузере совпадает, то проблем быть не может в принципе.
Проверьте ещё раз чтобы кодировки были идентичны: в браузере, в meta, и в самом файле скрипта. Наверняка где-то что-то не то.
Попробуйте поставить phpStorm и там в окне дебаггера посмотрите какой текст возвращает скрипт.
Лично у меня изначально пробные скрипты которые я для себя писал были в windows-1251, и когда я начал писать русские символы то начались баги в браузере с ней. Поставил кодировку utf-8 в плюсплюсе и вместо русских символов появились крякозябры. Вернул всё в зад и сделал не просто ВИД кодировки, а именно ПЕРЕКОДИРОВАЛ файл в utf-8 и всё стало на свои места.
тут теги режутся, короче в meta (по ссылке тут http://htmlbook.ru/html/meta/content) должна обязательно стоять кодировка как в файле.
А не лучше ли при работе с кириллицей использовать htmlspecialchars?
Руслан, можно попробовать, она, в отличие от htmlentities, поменьше сущностей преобразует. Однако даже с htmlentities не должно быть проблем с кириллицей.
Ещё два workaround’а с кодировкой тут отпишу. На самом деле один из них даже не костыль, а реальное применение.
1) Попробуйте перед выполнением скрипта выполнить такую функцию:
header(«Content-Type: text/html; charset=UTF-8»);
2) В настройках apache в корневой .htaccess запихнуть директиву AddDefaultCharset UTF-8
отдельной строкой
Алехсандыр, если у тебя текс был в какойто Жопошной кодировке, то смени в Notepad++ кодировку на UTF-8 или на какую тебе надо и просто перепиши текст сначала, у меня тож такое было, в браузере в место «браузер» показывало «%Dj%.mwa%D%%» ну всякую хрень кароче, поменял кодировку на UTF-8 тоже самое. Потом решил переписать текст заново но уже в кодировке UTF-8 И все получилось!) советую и тебе так сделать)
если использовать так
$userInputEntities = htmlentities(strip_tags($userInput), ENT_QUOTES, «cp1251»);
то на выходе
Смотрите, сейчас я перенаправлю вас на example.com! Хахаха! window.location = ‘http://www.example.com/’ ‘
если использовать как в задании, то теги не меняются вообще. в чем проблема?
правильнее:
$userInputEntities = htmlentities ($userInput, ENT_QUOTES, ‘UTF-8’);
Вообще ничего не понял… куда хакер будет писать эти данные?
$userInput = «Смотрите, сейчас я перенаправлю вас на example.com! Хахаха!
window.location = ‘http://www.example.com/’
‘»;
пробовал вставлять в поле «Укажите ваше имя», нажал «передать информацию», згружается та же страница index.php? только имя пустое и все, функцию Htmlentities не использовал…
верх: «»
и сабж: «$userInputEntities = htmlentities ($userInput, ENT_QUOTES, «UTF-8″);»
в двойных кавычках UTF-8, это критично )
А что лучше использовать htmlentities или htmlspecialchars???
echo htmlentities(htmlentities($str)); -Вот правильное решение
Применительно к примеру из этого сайта правильный, работающий код такой:
$userInputEntities = htmlentities($userInput);
echo htmlentities($userInputEntities);