Экранировать одинарные кавычки php. PHP регулярные выражения экранирование – особенности реализации

Слеш, от английского slash - обратная косая черта, которая непонятным образом вдруг сама собой появляется в Ваших данных. Добавляется он к некоторым спецсимволам, но в основном его используют для расстановки кавычек. Слеш нужен только при работе с базой данных. Причем нужен обязательно. Во всех остальных случаях он только мешает. Сейчас мы рассмотрим оба случая, и научимся писать программы, не зависящие от настроек PHP.


За автоматическое добавление слешей отвечают директивы php.ini



magic_quotes_gpc
magic_quotes_runtime



Первая - если включена - автоматически добавляет слеши к данным пришедшим от пользователя - из POST, GET запросов и кук. Вторая - от полученных во время исполнения скрипта - например, из файла. Но не всегда есть доступ к настройкам PHP, особенно если программа пишется для распространения.


Для Вашей же безопасности прочтите ВЕСЬ текст, независимо от Вашего случая.


1. Если Вы работаете БЕЗ базы данных
Это значит, что автоматическое добавление слешей Вам не нужно. Если PHP добавил, то нужно избавиться.


Проверить, добавил ли PHP, можно с помощью функции get_magic_quotes_gpc().
Удаляет слеши функция stripslashes().
Теперь нам осталось только проверить, и если PHP добавил, то перебрать все переменные в скрипте, и удалить слеши. Сделать это можно одной функцией, с помощью массива $GLOBALS, содержащего все переменные, имеющиеся в скрипте:



if (get_magic_quotes_gpc()) strips($GLOBALS);


function strips(&$el) {
if (is_array($el)) {
foreach($el as $k=>$v) {
if($k!="GLOBALS") {
strips($el[$k]);
}
}
} else {
$el = stripslashes($el);
}
}



Слеши будут удалены как из глобальных массивов, так и из всех переменных, которые образуются при register_globals=on.


Здесь надо сделать небольшое отступление. Перебор массива $GLOBALS требуется только в том случае, если у вас включена register_globals, и Вы пользуетесь переменными, автоматически назначенными значениям, переданным в скрипт. Если Вы ими не пользуетесь, то достаточно убрать слеши из нужных массивов -
$_POST, $_GET и так далее.


Чтобы избавиться от добавления слешей при получении данных из файла, достаточно в начале скрипта написать:



set_magic_quotes_runtime(0);



2. Если Вы работаете с MySQL
Два основных правила составления запросов в mysql:


  • Во всех переменных должны быть экранированы слешами спецсимволы.
    Важное замечание. Добавленные слеши НЕ идут в базу. Они нужны только в запросе.
    При попадании в базу слеши отбрасываются. Соответственно, распространенной
    ошибкой является применение stripslashes при получении данных из базы.

  • Все строковые переменные должны быть заключены в кавычки (одинарные или двойные, но удобнее и чаще используются одинарные). Для простоты можно заключать в кавычки и числовые переменные - mysql сам преобразует их к нужному виду. То есть, для надежности, любые данные, вставляемые в запрос, надо заключать в кавычки. Сделать просто addslashes() будет неправильно. А вдруг PHP сам добавил уже? Это надо проверить. Для этого служит функция get_magic_quotes_gpc().
    Если данные пришли из браузера пользователя методом GET или POST, то надо писать так:

    if (!get_magic_quotes_gpc()) $var=addslashes($var);



    Если данные берутся из файла (что бывает редко, но все же), то

    if (!get_magic_quotes_runtime()) $var=addslashes($var);



    Но, что интересно. Специально для mysql в последних версиях PHP появилась функция mysql_escape_string(), которая экранирует на один символ больше, чем addslashes. Наверное, есть смысл пользоваться именно ей.
    Если у Вас есть специальная функция для составления запросов, то экранирование можно вставить в нее. Если нет, то можно воспользоваться такой функцией:

function adds(&$el,$level=0) {
if (is_array($el)) {
foreach($el as $k=>$v) adds($el[$k],$level+1);
} else {
$el = addslashes($el);
if (!$level) return $el;
}
}

Эта функция используется двояко.
Если параметром указать строку, то функция вернет ее с экранированными спецсимволами.
Удобно для вставления в запрос, вида



"SELECT * FROM table WHERE name="".adds($name).""";



Если же параметром будет массив, то функция ничего не возвратит, а просто "прослешит" рекурсивно все его элементы. Например, adds($_POST); выполнит обычную работу magic_quotes для этого массива.


Следует обратить внимание, что ни одна из функций, добавляющих слеши, не добавляет их к метасимволам поиска "%" и "_", используемым в операторе LIKE. Поэтому, если вы используете этот оператор, добавляйте слеши вручную.



$data=preg_replace("/(%|_)/","\\\\\1",$data);




Правила экранирования могут отличаться для других СУБД.


Примечание:.
При выводе value в тегах input форм, слеши не помогают. Чтобы текст в таком поле выводился целиком, надо value заключать в кавычки, а к выводимым данным применять функцию htmlspecialchars.
Пример:





Technorati : ,

Не так давно один из участников моего форума обнаружил ошибку у меня на сайте. Если ввести "/ " в форму поиска, то выдавалась ошибка. Вроде бы ничего серьёзного, но это не очень хорошо. Поэтому эту ошибку я сразу нашёл и исправил. А ошибка была в том, что я кое-что забыл учесть. Это немного связано с экранированием регулярных выражений на PHP , и давайте разберём эту тему подробнее.

Любое регулярное выражение, которое составляется из того, что прислал пользователь, всегда надо пропускать через функцию preg_quote() . Данная функция добавляет обратный слэш перед каждым служебным символом, например, перед символом "* ".

Зачем это нужно? Давайте рассмотрим такой пример:



?>

Но ведь наша цель была просто получить строку от пользователя без всяких спецсимволов (а "* " - это спецсимвол, соответствующий любому символу). А сам пользователь хотел, чтобы * была частью текста, а никак не спецсимволом. В результате, регулярное выражение работает не так, как требуется.

И данная проблема решается с помощью функции preg_quote() :

$str = "abc * abc"; // Эта строка пришла от пользователя, например, методом POST

preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

Теперь "* " будет заменена на "\* ", и никаких проблем при поиске соответсвия не возникнет, так как теперь "* " - это не более, чем часть текста, а не спецсимвол.

Вот на этом этапе я не ошибался, и всё сделал правильно, но я не учёл ещё кое-что:


$str = preg_quote($str); // Экранируем служебные символы
preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

После подстановки регулярное выражение станет таким: "/abc / abc/ ". Как Вы понимаете, оно работать не будет, и PHP выдаст ошибку.

Вот эту-то ошибку и обнаружил один из посетителей данного сайта. Решается она очень просто: все прямые слэши экранируются отдельно . Если Вы используете другой символ границы регулярного выражения (например, "# "), то надо экранировать его. Итак, вот правильный код:

$str = "abc / abc"; // Эта строка пришла от пользователя, например, методом POST
$str = preg_quote($str); // Экранируем служебные символы
$str = str_replace("/", "\/", $str); // Экранируем прямой слэш
preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

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

  1. Экранировать регулярное выражение с помощью функции preg_quote() .
  2. Экранировать символ границы регулярного выражения с помощью функции str_replace() .

После этого проблем с ошибками регулярных выражений быть уже не должно.

Строки в PHP обрамляются одинарными или двойными кавычками. Главное различие в том, что в двойные кавычки можно подставить переменную:

Теперь мы можем придумать ещё одно решение задачи из урока Переменные в PHP :

$title"; echo "

$content
"; ?>

Как PHP находит переменную в строке?

Всё просто. Помните, какие символы могут использоваться в названии переменной? Это цифры, буквы и подчёркивание _ .

Вот PHP и принимает за название всё, что находится между символом $ и первым запрещённым символом.

В следующем коде PHP неправильно определит название переменной и выдаст ошибку:

Результат в браузере:

Notice: Undefined variable: priceруб in D:\OpenServer\domains\сайт\index.php on line 3

Чтобы PHP правильно определил название переменной в строке, нужно поместить её в фигурные скобки {} :

Результат в браузере:

1499руб

Нет однозначного мнения, какие кавычки нужно использовать для обычных строк, в которые ничего не нужно подставлять. Однако, многие программисты предпочитают использовать одинарные кавычки.

Дело в том, что двойные кавычки у многих вызывают ассоциацию "в эту строку что-то должно подставляться". Поэтому я рекомендую использовать одинарные кавычки для обычного текста, а двойные - только когда в текст нужно подставить переменную. Пример:

Экранирование кавычек

Если вам нужно поместить кавычки внутрь строки, есть 2 способа это сделать:

Во втором примере обратный слеш \ экранирует следующую за ним кавычку, чтобы PHP воспринял её как строку.

Как думаете, что нужно сделать, чтобы вывести на экран только обратный слеш? Ведь он будет экранировать закрывающую кавычку. Забавно, но нужно написать второй слеш для экранирования первого:

Табуляция и перенос строки в двойных кавычках

Обратный слеш в двойных кавычках позволяет экранировать не только кавычки и самого себя, но и некоторые другие символы. Наиболее популярные из них - это табуляция (длинный пробел, который вы получаете при нажатии TAB) и перенос строки. Выглядят они следующим образом:

Напишите скрипт, который:
1. Создаёт переменную $type со значением Игра .
2. Создаёт переменную $name со значением "World of Warcraft" (с кавычками).
3. Выводит обе переменные внутри тега

. Между переменными должен быть пробел.

(PHP 4, PHP 5, PHP 7)

addcslashes — Quote string with slashes in a C style

Description

addcslashes (string $str , string $charlist ) : string

Returns a string with backslashes before characters that are listed in charlist parameter.

Parameters

The string to be escaped.

Charlist

A list of characters to be escaped. If charlist contains characters \n , \r etc., they are converted in C-like style, while other non-alphanumeric characters with ASCII codes lower than 32 and higher than 126 converted to octal representation.

When you define a sequence of characters in the charlist argument make sure that you know what characters come between the characters that you set as the start and end of the range.

echo addcslashes ("foo" , "A..z" );
// output: \f\o\o\[ \]
// All upper and lower-case letters will be escaped
// ... but so will the [\]^_`
?>

Also, if the first character in a range has a higher ASCII value than the second character in the range, no range will be constructed. Only the start, end and period characters will be escaped. Use the ord() function to find the ASCII value for a character.

echo addcslashes ("zoo["."]" , "z..A" );
// output: \zoo["\."]
?>

Be careful if you choose to escape characters 0, a, b, f, n, r, t and v. They will be converted to \0, \a, \b, \f, \n, \r, \t and \v, all of which are predefined escape sequences in C. Many of these sequences are also defined in other C-derived languages, including PHP, meaning that you may not get the desired result if you use the output of addcslashes() to generate code in those languages with these characters defined in charlist .


Друзья!
Мы находимся в процессе большой чистки!
Возможны ошибки и кривизна страниц
Просмотреть всё и быстро не возможно!
Если нашли какую-то ошибку, то если вам не трудно напишите адрес...
Сейчас вы здесь:

http://сайт/page/php/039_php_kavyichki.html

Php кавычки, кавычки одинарные, двойные, экранирование

Сегодня займёмся кавычками, но не простыми, а кавычками в PHP и плюс экранирование кавычек, варианты.

Начнем с того, что в PHP допускается применение и двойных кавычек и одинарных.

И есть несколько вариантов экранирования кавычек.

Где располагаются кавычки на клавиатуре?

Если вы собираетесь работать в коде, то вам нужно знать где находиться кавычки на клавиатуре в латинской раскладке – это

буква Э – строчная:

и прописана буква э – это одинарные кавычки:

php символ двойных и одинарных кавычек

Естественно, что вам потребуется символ кавычек, т.е. если вам нужно вывести кавычку, но чтобы она не срабатывала, для этого и существуют символы кавычек.

Символ двойных кавычек:

"

Символ одинарных кавычек:

"

Php экранирование кавычек.

Что вы собственно подразумеваете под словами экранирование кавычек в php.

Давайте разберем пример, ведь на примерах всегда легче понять о чем идет речь!

Давайте напишем код php:

echo "Кавычки php ";

Но если мы вставим данный код сюда, то боюсь, что вы никогда бы не увидели данные строчки!?

Почему? Да просто потому, что код не сработает.

Специально для вас сделал , с вставленным в неё данным кодом, и если хотите то вы можете посмотреть, что из этого у вас получилось бы!

Почему такое произошло?

Потому что внутри echo появились дополнительные кавычки, которые воспринимаются как код php и если их становится больше чем положено, то и получается ошибка!

Что делать в таком случае!?

Нужно заменить двойные кавычки на одинарные.

Давайте возьмем этот же код и поменяем дойные кавычки на одинарные.

echo ‘"Кавычки php "’;

Смотрим, что у нас получилось!

Т.е. мы взяли верхний код и вставили прямо на эту страницу и вот получился вывод:


2.

Второй вариант экранирования кавычек.

Бывают такие ситуации, что использование одинарных кавычек невозможно!

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

Давайте возьмем предыдущую запись и сделаем все тоже самое, только с использованием слеша:

echo "Кавычки php ";

Смотрим результат:

Как вывести кавычки.

Для того, чтобы вывести кавычки на экран, и чтобы они не являлись кодом php – как бы странно это не звучало! Кавычки нужно поменять на html сущности, например:

Одинарная кавычка через html код::

" - одинарная кавычка « " »

Двойная кавычка через html код:

" - двойная кавычка « " »

Такая кавычка будет выглядеть как кавычка на экране, но в коде Php уже участвовать не будет…

И ещё!

Ко всему коду PHP надо относиться внимательно! Если вы к примеру писали что-то в программе Word, какой-то текст, потом, в нем же начали делать код, как получилось у меня в первый раз.

И я никак не мог понять в чем проблема – он реально мне не хотел показывать простой код. Я готов был сломать комп кувалдой!!!

А оказалась, что кавычки в редакторе кода отличаются от Word. И это никак невозможно понять, если вы через это не прошли!