Экранирование кавычек (htmlspecialchars)
Здравствуйте! Хочу задать заезженный вопрос касаемый экранирования спецсимволов. При добавлении в базу применяю функцию htmlspecialchars(). При выводе в
Текст текст «текст» , кавычки отображаются нормально, а вот в meta title Текст текст "текст" . Как сделать чтобы кавычки в TITLE отображались нормально и как грамотно реализовать данную задачу?Отслеживать
задан 20 мар 2014 в 23:43
308 1 1 золотой знак 5 5 серебряных знаков 20 20 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
htmlspecialchars() нужно выполнять не при добавлении в базу, а непосредственно при выводе на страницу (при подстановке в HTML-шаблон). При добавлении в базу данных нужно использовать функцию экранирования кавычек, которая перед кавычками добавляет обратный слэш («\»). Это может делать, например, mysqli_escape_string() . Экранирование кавычек при добавлении в БД нужно только для корректного сохранения, при сохранении бэкслэши уберутся и в базе будет храниться исходный вариант (без бэкслэшей). В базе данных желательно хранить текстовые значения в оригинальном виде. Если хранить их заранее обработанные htmlspecialchars() , то могут возникнуть трудности с поиском и выводом этих записей не в HTML (например, в JSON или в консоль). Поэтому при сохранении в базу текстовой строки (при подстановке её в SQL-запрос) используешь mysqli_escape_string() (на крайняк addslashes() ). При выводе в HTML оборачиваешь переменную с текстовым значением в htmlspecialchars() . Причём, в htmlspecialchars() надо оборачивать любые текстовые строки, которые не являются HTML-форматированными, вне зависимости берутся они из базы или нет.
Отслеживать
ответ дан 21 мар 2014 в 4:28
105 1 1 серебряный знак 9 9 бронзовых знаков
- php
- htmlspecialchars
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Экранирование кавычек в php, javascript и sql
Здравствуйте, уважаемые читатели блога LifeExample, сегодня я бы хотел раскрыть тему экранирования кавычек в php, javascript и sql, рассказать что это такое и зачем нужно, а также привести несколько полезных примеров показывающих необходимость экранирования.
Что такое экранирование кавычек
Чтобы дать определение этому понятию, для начала приведу небольшой пример объявления строки.
Практически в любом языке программирования мы используем следующий принцип объявления строковой переменной:
var text = «Название моего блога компании — lifeexample » ;
Все, что содержится между кавычек — понимается интерпретатором как строка.
Если нам нужно передать в строковую переменную текст содержащий кавычки и мы попытаемся сделать это таким образом:
var text = «Название моего блога: » lifeexample. ru » » ;
то произойдет ошибка, поскольку вместо одной строки интерпретатор увидит две:
- «Название моего блога: «
- » «
а между ними неизвестный ему оператор – lifeexample.ru .
Чтобы такого не происходило необходимо экранировать кавычки. В javascript, например, это будет выглядеть таким образом:
var text = «Название моего блога: \» lifeexample.ru \» » ;
После данного практического примера можно дать определение понятию экранирования кавычек.
Экранирование кавычек – это действие, совершаемое над строковой переменной в ходе работы скрипта. Действие это позволяет использовать кавычки в строке. Частным но довольно распространенным способом экранирования является подстановка обратного слеша \ перед внутренними кавычками.
Php экранирование кавычек
В php экранировать кавычки можно несколькими способами, первый из них аналогичен рассматриваемому выше.
Например, мы имеем строку с авторской и прямой речью, которая содержит кавычки:
«Как же вы поживаете?» – спросила Екатерина Ивановна. «Ничего, живем понемножечку», – ответил Старцев (Чехов)
Чтобы вывести ее на страницу, в PHP следует делать одним из следующих способов.
Экранирование обратным слешем:
echo » \» Как же вы поживаете? \» – спросила Екатерина Ивановна. \» Ничего, живем понемножечку \» , – ответил Старцев (Чехов)» ;
Экранирование одинарными кавычками
echo ‘»Как же вы поживаете?» – спросила Екатерина Ивановна. «Ничего, живем понемножечку», – ответил Старцев (Чехов)’ ;
В случае, когда внутренних кавычек в строке много проще при объявлении строки использовать одинарные кавычки, а внутри нее двойные. Либо, наоборот, в зависимости от наличия в тексте тех или иных кавычек.
Зачем может понадобиться экранирование кавычек в PHP
Помимо разобранного примера с выводом строк, экранирование кавычек и других спец символов зачастую необходимо при работе с БД.
Чтобы не допустить, различного рода проблем при работе с базой данных, перед сохранением данных в таблицы можно использовать функцию addslashes
$str = «Is your name O’reilly?» ;
// выводит: Is your name O\’reilly?
echo addslashes ( $str ) ;
$item = «Zak’s and Derick’s Laptop» ;
$escaped_item = mysql_real_escape_string ( $item ) ; \\Escaped string : Zak\ ‘s and Derick\’s Laptop
?>?php>
Обе эти функции являются стандартными в php и экранируют спецсимволы строк. Когда и какую использовать, зависит от конкретных задач. Например addslashes лучше использовать для сериализованной строки при записи ее в базу, а mysql_real_escape_string для всех пользовательских данных пришедших с формы на сайте.
В небольших web-приложениях, можно не использовать ручное экранирование addslashes или mysql_real_escape_string если включить «Магические кавычки» — magic_quotes_gpc
if ( ! get_magic_quotes_gpc ( ) ) {
ini_set ( ’magic_quotes_gpc’ , ‘on’ ) ;
}
Зачастую магические кавычки включены по умолчанию на сервере, это можно узнать из информацией полученной при выполнении функции
echo phpinfo ( ) ;
javascript экранирование кавычек
Очень часто, особенно в javascript приходится работать со строками, содержащими HTML разметку.
В javascript экранирование кавычек происходит аналогичным образом, либо обратным слешем, либо использованием разного типа кавычек.
Пример с обратным слешем:
var html = «
» ;
Пример с внутренними кавычками:
var html = ‘
‘ ;
Когда строка с HTML разметкой слишком длинная и требует переноса строки, снова появляется необходимость экранирования, в этом случае уже не кавычек, а символа переноса строки
var html = ‘
Блок с зеленым текстом \
‘ ;
Если в данном примере не использовать обратный слешь перед переносом строки, то скрипт работать не будет.
Довольно редко, но можно столкнуться с задачей передать HTML разметку в сериализованной строке формата JSON. Если строка содержит символы переноса, то формат JSON будет нарушен.
Чтобы избежать этих проблем нужно прогнать текст с переносом строк через функцию JSON.stringify()
text = JSON . stringify ( text ) ;
JSON.stringify() – доступна только после подключения библиотеки jquery.
Sql экранирование кавычек
В sql экранирование кавычек помимо разобранных нами в php и js способов — обратного слеша и внутренних кавычек, имеет еще одно решение.
SELECT «Is your name O»reilly?» ;
Для экранирования кавычки в sql нужно их дублировать.
вместо ‘ писать »
вместо » писать «»
Убрать экранирование кавычек
Убрать экранирование кавычек в php можно стандартной функцией stripslashes();
В javascript не существует аналога stripslashes, но ведь мы всегда можем воспользоваться регулярным выражением, которое поможет нам убрать экранирование кавычек в javascript
str. replace ( /\0/g , ‘0’ ) . replace ( /\\(.)/g , «$1» )
В данной статье я постарался раскрыть тему экранирования кавычек в php, js, mysql и показать в каких случаях необходимо применять экранирование. Надеюсь, статья оказалась полезной. Подписывайтесь на рассылку, ставьте лайки, добавляйтесь в друзья
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
PHP: Кавычки
В этом уроке мы разберем, что такое строки, зачем для них нужны одинарные и двойные кавычки. Также узнаем, что такое экранирующие последовательности и конкатенация.
Что такое строка
Любой одиночный символ в кавычках — это строка. Например:
'Hello' 'Goodbye' 'G' ' ' ''
Пустая строка » — это тоже строка. То есть строкой мы считаем все, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов.
Ранее в уроках мы записывали строки в одинарных кавычках, но можно использовать и двойные:
Разберем, почему у обозначения строки есть два способа.
Зачем нужны двойные кавычки
Представим, что нам нужно напечатать строчку dragon’s mother . Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:
Такая программа не будет работать. С точки зрения PHP строчка началась с одинарной кавычки, а потом закончилась после буквы n. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: ‘); . Этот код синтаксически некорректен.
Здесь помогут двойные кавычки. Такой вариант программы отработает корректно:
Теперь интерпретатор знает, что строка началась с двойной кавычки, значит, завершиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки.
Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки неважно.
Теперь представим, что мы хотим создать такую строку:
Dragon's mother said "No"
В ней есть и одинарные, и двойные кавычки. В этой ситуации нужно указать интерпретатору, что нужно считать каждую кавычку частью строки, а не началом или концом.
Для этого экранируют специальные символы. В нашем случае это символ, который является признаком конца и начала строки, — либо одинарная кавычка, либо двойная, в зависимости от ситуации. Для экранирования используется обратный слеш \ .
Dragon's mother said "No"
Нам нужно было добавить \ для двойных кавычек, но не для апострофа, потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.
Death is \so terribly final
Также нам может понадобиться вывести сам обратный слеш:
Это тоже можно сделать через экранирование, но уже самого себя.
Задание
Напишите программу, которая выведет на экран:
"Khal Drogo's favorite word is "athjahakar""
Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы:
"Khal Drogo's favorite word is "athjahakar""
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Как экранировать кавычки в php
Чтобы использовать метод POST атрибуту method тега form присваиваается значение “post”. При нажатии кнопки “Enter”, браузер производит следующие действия: 1) Просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы. Допустим, введено имя Alex. В этом случае данные формы – name=Alex&okbutton=Enter.
2) Устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action (page1_1.php) тэга , используя метод отправки данных, указанный в атрибуте method (в данном случае – POST), передавая в запросе данные формы.
3) Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение.
4) Браузер отображает полученный от сервера документ.
PHP автоматически заполняет массив $_POST:
$_POST['name'] = 'Alex' $_POST['okbutton'] = 'Enter'
Именно к элементу $_POST[‘name’] идет обращение в файле page1_1.php
Ваше имя: Alex
Метод GET
Изменим значение атрибута method тега form на “get” (хотя метод GET используется по умолчанию). PHP с GET-формами поступает аналогично – заполняет массив $_GET.
В этот раз браузер отправляет GET-запрос, который равносилен вводу в адресной строке адреса:
http://адрес-сайта/page1_1.php?name=Alex&okbutton=Enter
Результат аналогичен.
magic_quotes_gpc и stripslashes
magic_quotes_gpc boolean («магические кавычки») – это функция установки magic_quotes для GPC(Get / Post / Cookie?) операций. Когда magic_quotes включены (on), все ‘(одиночные кавычки), «(двойные), \(слэши) и пустоты экранируются бэкслэшами автоматически. get_magic_quotes_gpc() получает текущую активную установку конфигурации «магических кавычек» gpc.
stripslashes – удаляет экранирование символов.
Рассмотрим пример применения этих функций.
Оставим файл form.php (см. выше методы GET и POST) изменений. Файл page1_1.php прийдется изменить следующим образом:
get_magic_quotes_gpc() подключен
Если использовать stripslashes(): your name ".stripslashes($u_name)."
"; > // $u_name = $_POST['name']; echo "Если не использовать stripslashes(): your name ".($u_name)."
"; ?>
Если ввести в форму имя D’Artanian, то в итоге получим такие результаты, в комментариях не нуждающиеся:
get_magic_quotes_gpc() подключен Если использовать stripslashes(): your name D'Artanian Если не использовать stripslashes(): your name D\'Artanian
Массив $_REQUEST
Массив $_REQUEST объединяет в себе три массива ($_GET, $_POST и $_COOKIE). Поэтому для создания программ в не зависимости от метода передачи данных, полезно использовать именно его: к примеру, $u_name = $_POST[‘name’] можно заменить на $u_name = $_REQUEST[‘name’].
Бывают случаи, когда требуется разделить методы приема, но тогда Вы сами решите для себя какой массив использовать $_GET[. ] или $_POST[. ].