Php как экранировать обратный слэш
Перейти к содержимому

Php как экранировать обратный слэш

  • автор:

addslashes

Возвращает строку с обратным слешом перед символами, которые нужно экранировать. Экранируются одиночная кавычка ('), двойная кавычка ("), обратный слеш (\) и NUL ( NULL байт).

Примером использования функции addslashes() может служить добавление данных в строку, которую будет выполнять PHP. Например, если O'Reilly помещается в переменную $str, то вам необходимо экранировать $str. (т.е. eval("echo '".addslashes($str)."';"); )

Для экранирования параметров в базе данных нужно использовать специализированные экранирующие функции СУБД (т.е. (e.g. mysqli_real_escape_string() для MySQL или pg_escape_literal() , pg_escape_string() для PostgreSQL). СУБД имеют разные спецификации для идентификаторов (т.е. имен таблиц, имен полей) и для параметров. Некоторые СУБД, такие как PostgreSQL, предоставляют отдельные функции экранирования идентификаторов ( pg_escape_identifier() ), но не все СУБД предоставляют такое API. В этом случае ориентируйтесь на документацию к вашей базе данных для выбора верного способа экранирования.

Если в вашей СУБД нет экранирующей функции и она использует символ \ для экранирования специальных символов, то вы можете использовать функцию addslashes() , но только если этот метод экранирования походит для вашей базы данных. Обратите внимание на то, что использование этой функции для экранирования параметров может привести к проблемам безопасности во многих базах данных.

Директива конфигурации magic_quotes_gpc по умолчанию имела значение on в версиях до PHP 5.4, при этом функция addslashes() автоматически применялась ко всем данным GET, POST, и COOKIE. Не используйте addslashes() для данных, обработанных magic_quotes_gpc, чтобы избежать двойного экранирования. Для проверки состояния этой директивы используется get_magic_quotes_gpc() .

addslashes

Небольшой пример использования функции addslashes() для экранирования вышеперечисленных символов:

Иногда функцию addslashes() некорректно пытаются использовать для предотвращения SQL-инъекций. Не делайте так. Вместо неё используйте подготовленные запросы или функции экранирования соответствующих модулей работы с базами данных.

Список параметров

Возвращаемые значения

Возвращает экранируемую строку.

Примеры

Пример #1 Пример использования addslashes()

<?php
$str = «Ваше имя O’Reilly?» ;

// выводит: Ваше имя O\’Reilly?
echo addslashes ( $str );
?>

Смотрите также

  • stripcslashes() — Удаляет экранирование символов, произведённое функцией addcslashes
  • stripslashes() — Удаляет экранирование символов
  • addcslashes() — Экранирует строку слешами в стиле языка C
  • htmlspecialchars() — Преобразует специальные символы в HTML-сущности
  • quotemeta() — Экранирует специальные символы
  • get_magic_quotes_gpc() — Получение текущего значения настройки конфигурации magic_quotes_gpc

User Contributed Notes 19 notes

Never use addslashes function to escape values you are going to send to mysql. use mysql_real_escape_string or pg_escape at least if you are not using prepared queries yet.

keep in mind that single quote is not the only special character that can break your sql query. and quotes are the only thing which addslashes care.

To output a PHP variable to Javascript, use json_encode().

$var = «He said \»Hello O’Reilly\» & disappeared.\nNext line. » ;
echo «alert(» . json_encode ( $var ). «);\n» ;

?>

Output:
alert(«He said \»Hello O’Reilly\» & disappeared.\nNext line. «) ;

Beware of using addslashes() on input to the serialize() function. serialize() stores strings with their length; the length must match the stored string or unserialize() will fail.

Such a mismatch can occur if you serialize the result of addslashes() and store it in a database; some databases (definitely including PostgreSQL) automagically strip backslashes from «special» chars in SELECT results, causing the returned string to be shorter than it was when it was serialized.

In other words, do this.

<?php
$string = «O’Reilly» ;
$ser = serialize ( $string ); # safe — won’t count the slash
$result = addslashes ( $ser );
?>

. and not this.

<?php
$string = «O’Reilly» ;
$add = addslashes ( $string ); # RISKY! — will count the slash
$result = serialize ( $add );
?>

In both cases, a backslash will be added after the apostrophe in «O’Reilly»; only in the second case will the backslash be included in the string length as recorded by serialize().

[Note to the maintainers: You may, at your option, want to link this note to serialize() as well as to addslashes(). I’ll refrain from doing such cross-posting myself. ]

For PHP 7.3.* use FILTER_SANITIZE_ADD_SLASHES.

<?php
$str = «Is your name O’Reilly?» ;
$strWithSlashes = filter_var ( $str , FILTER_SANITIZE_ADD_SLASHES );

// Outputs: Is your name O\’Reilly?
echo $strWithSlashes ;

If all you want to do is quote a string as you would normally do in PHP (for example, when returning an Ajax result, inside a json string value, or when building a URL with args), don’t use addslashes (you don’t want both » and ‘ escaped at the same time). Instead, just use this function:

<?php
function Quote ( $Str ) // Double-quoting only
<
$Str = str_replace ( ‘»‘ , ‘\»‘ , $Str );
return ‘»‘ . $Str . ‘»‘ ;
> // Quote
?>

Modify this easily to get a single-quoting function.

This function is deprecated in PHP 4.0, according to this article:

Also, it is worth mentioning that PostgreSQL will soon start to block queries involving escaped single quotes using \ as the escape character, for some cases, which depends on the string’s encoding. The standard way to escape quotes in SQL (not all SQL databases, mind you) is by changing single quotes into two single quotes (e.g, ‘ ‘ ‘ becomes ‘ » ‘ for queries).

You should look into other ways for escaping strings, such as «mysql_real_escape_string» (see the comment below), and other such database specific escape functions.

Be careful on whether you use double or single quotes when creating the string to be escaped:

$test = ‘This is one line\r\nand this is another\r\nand this line has\ta tab’;

echo $test;
echo «\r\n\r\n»;
echo addslashes($test);

$test = «This is one line\r\nand this is another\r\nand this line has\ta tab»;

echo $test;
echo «\r\n\r\n»;
echo addslashes($test);

Addslashes is *never* the right answer, it’s (ab)use can lead to security exploits!

if you need to escape HTML, it’s (unfortunately)
<?php
echo htmlentities ( $html , ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED );
?>
if you need to quote shell arguments, it’s
<?php
$cmd .= » —file keyword»>. escapeshellarg ( $arg );
?>
if you need to quote SQL strings it’s
<?php
$sql .= «WHERE col = ‘» . $mysqli -> real_escape_string ( $str ). «‘» ;
?>
or
<?php
$sql .= «WHERE col keyword»>. $pdo -> quote ( $str );
?>
if you need to quote javascript/json strings its
<?php
let str = <?= json_encode ( $str , JSON_THROW_ON_ERROR ); ?> ;
?>

if you need to quote a string in xpath it’s
<?php
//based on https://stackoverflow.com/a/1352556/1067003
function xpath_quote ( string $value ): string <
if( false === strpos ( $value , ‘»‘ )) <
return ‘»‘ . $value . ‘»‘ ;
>
if( false === strpos ( $value , ‘\» )) <
return ‘\» . $value . ‘\» ;
>
// if the value contains both single and double quotes, construct an
// expression that concatenates all non-double-quote substrings with
// the quotes, e.g.:
//
// concat(«‘foo'», ‘»‘, «bar»)
$sb = ‘concat(‘ ;
$substrings = explode ( ‘»‘ , $value );
for( $i = 0 ; $i < count ( $substrings );++ $i ) <
$needComma =( $i > 0 );
if( $substrings [ $i ]!== » ) <
if( $i > 0 ) <
$sb .= ‘, ‘ ;
>
$sb .= ‘»‘ . $substrings [ $i ]. ‘»‘ ;
$needComma = true ;
>
if( $i < ( count ( $substrings ) — 1 )) <
if( $needComma ) <
$sb .= ‘, ‘ ;
>
$sb .= «‘\»‘» ;
>
>
$sb .= ‘)’ ;
return $sb ;
>
$xp -> query ( ‘/catalog/items/item[title=’ . xpath_quote ( $var ). ‘]’ );
?>
if you need to quote strings in CSS its
<?php
// CSS escape code ripped from Zend Framework ( https://github.com/zendframework/zf2/blob/master/library/Zend/Escaper/Escaper.php )
function css_escape_string ( $string )
<
$cssMatcher = function ( $matches ) <
$chr = $matches [ 0 ];
if ( strlen ( $chr ) == 1 ) <
$ord = ord ( $chr );
> else <
$chr = mb_convert_encoding ( $chr , ‘UTF-16BE’ , ‘UTF-8’ ); // $this->convertEncoding($chr, ‘UTF-16BE’, ‘UTF-8’);
$ord = hexdec ( bin2hex ( $chr ));
>
return sprintf ( ‘\\%X ‘ , $ord );
>;
$originalEncoding = mb_detect_encoding ( $string );
if ( $originalEncoding === false ) <
$originalEncoding = ‘UTF-8’ ;
>
;
$string = mb_convert_encoding ( $string , ‘UTF-8’ , $originalEncoding ); // $this->toUtf8($string);
// throw new Exception(‘mb_convert_encoding(\».$string.’\’,\’UTF-8\’,\».$originalEncoding.’\’);’);
if ( $string === » || ctype_digit ( $string )) <
return $string ;
>
$result = preg_replace_callback ( ‘/[^a-z0-9]/iSu’ , /*$this->*/ $cssMatcher , $string );
// var_dump($result);
return mb_convert_encoding ( $result , $originalEncoding , ‘UTF-8’ ); // $this->fromUtf8($result);
>

spamdunk at home dot com, your way is dangerous on PostgreSQL (and presumably MySQL). You’re quite correct that ANSI SQL specifies using ‘ to escape, but those databases also support \ for escaping (in violation of the standard, I think). Which means that if they pass in a string that includes a «\'», you expand it to «\»'» (an escaped quote followed by a non-escaped quote. WRONG! Attackers can execute arbitrary SQL to drop your tables, make themselves administrators, whatever they want.)

The best way to be safe and correct is to:

— don’t use magic quotes; this approach is bad. For starters, that’s making the assumption that you will be using your input in a database query, which is arbitrary. (Why not escape all «<«s with «&lt;»s instead? Cross-site scripting attacks are quite common as well.) It’s better to set up a way that does whatever escaping is correct for you when you use it, as below:

— when inserting into the database, use prepared statements with placeholders. For example, when using PEAR DB:

<?php
$stmt = $dbh -> prepare ( ‘update mb_users set password = ? where username = ?’ );
$dbh -> execute ( $stmt , array( ‘12345’ , ‘bob’ ));
?>

Notice that there are no quotes around the ?s. It handles that for you automatically. It’s guaranteed to be safe for your database. (Just ‘ on oracle, \ and ‘ on PostgreSQL, but you don’t even have to think about it.)

Plus, if the database supports prepared statements (the soon-to-be-released PostgreSQL 7.3, Oracle, etc), several executes on the same prepare can be faster, since it can reuse the same query plan. If it doesn’t (MySQL, etc), this way falls back to quoting code that’s specifically written for your database, avoiding the problem I mentioned above.

(Pardon my syntax if it’s off. I’m not really a PHP programmer; this is something I know from similar things in Java, Perl, PL/SQL, Python, Visual Basic, etc.)

addslashes

Возвращает сроку str, в которой перед каждым спецсимволом добавлен обратный слэш (\), например для последующего использования этой строки в запросе к базе данных. Экранируются одиночная кавычка (‘), двойная кавычка («), обратный слэш (\) и NUL (байт NULL ).

Функция addslashes() часто применяется при записи в базу данных. Предположим, если нужно внести в базу данных имя O’reilly, то символ ‘ должен быть экранирован. В большинстве баз данных для этого используется \, строка будет выглядеть как O\’reilly. Заметьте, что сам символ \ в базу данных записан не будет. Если директива конфигурации magic_quotes_sybase имеет значение on, то символ ‘ будет экранироваться добавлением еще одного ‘ вместо \.

Директива конфигурации magic_quotes_gpc по умолчанию имеет значение on, при этом функция addslashes() автоматически применяется ко всем данным GET, POST, и COOKIE. Не используйте addslashes() для данных, обработанных magic_quotes_gpc, чтобы избежать двойного экранирования. Для проверки состояния этой директивы используется get_magic_quotes_gpc() .

Php как экранировать обратный слэш

Обратная косая черта ('\') имеет несколько применений. Прежде всего, если она предшествует не буквенно-цифровому символу, она снимает с него специальное значение, которое он мог иметь. Применение обратной косой черты как экранирующего символа допустимо как в символьном классе, так и вне него.

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

Замечание:

PHP-строки, заключённые в одинарные и двойные кавычки, по-особому интерпретируют обратную косую черту. Таким образом, если необходимо сопоставить \ с регулярным выражением \\, в PHP-коде нужно использовать "\\\\" или '\\\\'.

В случае, если указан модификатор PCRE_EXTENDED, пробельные символы в шаблоне (вне описания символьного класса) игнорируются. Также игнорируется часть строки, находящаяся между символом "#" (опять же, не участвующем в описании символьного класса) и следующим символом перевода строки. В таком случае обратный слеш можно применять как экранирующий символ для указания вхождений пробельных символов или символа "#" в шаблоне.

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

\a символ оповещения, сигнал, (BEL, шестнадцатеричный код 07) \cx "Ctrl+x", где x — произвольный символ \e escape (шестнадцатеричный код 1B) \f разрыв страницы (шестнадцатеричный код 0C) \n перевод строки (шестнадцатеричный код 0A) \p символ со свойством xx, подробнее смотрите свойства unicode \P символ без свойства xx, подробнее смотрите свойства unicode \r возврат каретки (шестнадцатеричный код 0D) \R разрыв строки: совпадает с \n, \r и \r\n \t табуляция (шестнадцатеричный код 09) \xhh символ с шестнадцатеричным кодом hh \ddd символ с восьмеричным кодом ddd, либо ссылка на подмаску

Если быть более точным, комбинация " \cx " интерпретируется следующим образом: если " x " — символ нижнего регистра, он преобразуется в верхний регистр. После этого шестой бит символа (шестнадцатеричный код 40) инвертируется. Таким образом " \cz " интерпретируется как шестнадцатеричное значение 1A, в то время как " \c< " получает шестнадцатеричное значение 3B, а " \c; " - 7B.

После " \x " считываются ещё две шестнадцатеричные цифры (они могут быть записаны в нижнем или верхнем регистре). В режиме UTF-8, разрешается использование " \x <. >", где содержимое скобок является строкой из шестнадцатеричных цифр. Она интерпретируется как символ UTF-8 character с кодом, совпадающим с данным шестнадцатеричным числом. Исходная шестнадцатеричная экранирующая последовательность, \xhh , совпадает с двухбайтным UTF-8 символом, если его значение превышает 127.

После " \0 " считываются две восьмеричные цифры. Если в записи менее двух цифр, будут использованы все фактически присутствующие цифры. Таким образом, последовательность " \0\x\07 " будет интерпретирована как два бинарных нуля, за которыми следует символ оповещения (звонок). В случае, если вы используете представление числа в восьмеричном коде, убедитесь, что за начальным нулём следуют две значащие цифры.

Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее. Вне символьного класса PCRE воспринимает обратный слеш и следующие за ним цифры как десятичное число. Если полученное значение меньше десяти, либо если шаблон содержит по меньшей мере такое же количество предшествующих текущей позиции подмасок, вся конструкция интерпретируется как ссылка на подмаску. Более детальное описание будет приведено ниже при обсуждении механизма работы подмасок.

Внутри символьного класса, либо если полученное значение больше 9 и соответствующее количество предшествующих подмасок отсутствует, PCRE считывает до трёх восьмеричных цифр, следующих за обратным слешем, и генерирует один байт из последних 8-ми значащих битов полученного значения. Все последующие цифры обозначают себя же. Например:

\040 ещё один способ записи пробела \40 то же самое в случае, если данной записи предшествует менее сорока подмасок \7 всегда интерпретируется как ссылка на подмаску \11 может быть как обратной ссылкой, так и альтернативной записью символа табуляции \011 всегда интерпретируется как символ табуляции \0113 символ табуляции, за которым следует цифра "3" \113 интерпретируется как символ с восьмеричным кодом 113 (так как ссылок на подмаски не может быть более чем 99) \377 байт, всецело состоящий из единичных битов \81 либо обратная ссылка, либо бинарный ноль, за которым следуют цифры "8" и "1"

Следует помнить, что восьмеричные значения, превышающие 100, следует писать без лидирующего нуля, так как читается не более трёх восьмеричных цифр.

Все последовательности, определяющие однобайтное значение, могут встречаться как внутри, так и вне символьных классов. Кроме того, внутри символьного класса запись " \b " интерпретируется как символ возврата ('backspace', шестнадцатеричный код 08). Вне символьного класса она имеет другое значение (какое именно, описано ниже).

Третье использование обратного слеша — указание общего типа символов:

\d любая десятичная цифра \D любой символ, кроме десятичной цифры \h любой горизонтальный пробельный символ \H любой символ, не являющийся горизонтальным пробельным символом \s любой пробельный символ \S любой непробельный символ \v любой вертикальный пробельный символ \V любой символ, не являющийся вертикальным пробельным символом \w Любой символ, образующий "слово" \W Любой символ, не образующий "слово"

Каждая пара таких специальных последовательностей делит полное множество всех символов на два непересекающихся множества. Любой символ соответствует одному и только одному множеству из пары.

Следующие символы считаются как "пробельные": HT (9), LF (10), FF (12), CR (13), и пробел (32). Тем не менее, если идёт локале-зависимый поиск, и произойдёт совпадение с символами в диапазоне 128-255, они также будут восприняты как пробельные, например NBSP (A0).

Символ, образующий "слово" — это произвольная цифра, буква или символ подчёркивания, проще говоря, любой символ, который может являться частью "слова" в Perl. Определение букв и цифр управляется символьными таблицами, с которыми была собрана PCRE. И, как следствие, эти наборы могут отличаться в различных локализированных дистрибутивах. Например, в локали "fr" (Франция) некоторые символы с кодом выше 128 используются для записи ударных символов и, соответственно, соответствуют маске \w .

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

Четвёртое использование обратного слеша — определение некоторых формальных утверждений, описывающих условия касательно месторасположения особых позиций в строке и совершенно не затрагивающих сами символы. Использование подмасок как более сложных формальных утверждений описано ниже. Такими управляющими последовательностями являются:

\b граница слова \B не является границей слова \A начало данных (независимо от многострочного режима) \Z конец данных либо позиция перед последним переводом строки (независимо от многострочного режима) \z конец данных (независимо от многострочного режима) \G первая совпадающая позиция в строке

Описанные выше последовательности не могут встречаться в символьных классах (исключая комбинацию " \b ", которая внутри класса означает символ возврата 'backspace').

Границей слова считается такая позиция в строке, в которой из текущего и предыдущего символа только один соответствует \w или \W (т.е. один из них соответствует \w , а другой \W ). Начало или конец строки также соответствуют границе слова в случае, если первый или, соответственно, последний символ совпадает с \w .

Специальные последовательности \A , \Z и \z отличаются от общеупотребляемых метасимволов начала строки '^' и конца строки '$' (описанных в разделе якоря) тем, что они всегда совпадают либо в самом начале либо в самом конце строки. На них никак не влияют опции PCRE_MULTILINE и PCRE_DOLLAR_ENDONLY. Разница между \Z и \z в том, что \Z соответствует позиции перед последним символом в случае, если последний символ — перевод строки, кроме самого конца строки. В то время, как \z соответствует исключительно концу данных.

Утверждение \G является истинным только в том случае, если текущая проверяемая позиция находится в начале совпадения, указанного параметром offset функции preg_match() . Она отличается от \A при ненулевом значении параметра offset .

\Q и \E могут быть использованы для игнорирования метасимволов регулярных выражений в шаблоне. Например: \w+\Q.$.\E$ совпадёт с один или более символов, составляющих "слово",за которыми следуют символы .$. и якорь в конце строки. Обратите внимание, что это не меняет поведения разделителей; например, шаблон #\Q#\E#$ некорректен, потому что второй # отмечает конец шаблона, а \E# интерпретируется как недопустимые модификаторы.

Последовательность \K может быть использована для сброса начала совпадения. Например, шаблон foo\Kbar совпадёт с "foobar", но сообщит о том, что совпал только с "bar". Использование \K не мешает установке подмасок. Например, если шаблон (foo)\Kbar совпадёт со строкой "foobar", первой подмаской всё равно будет являться "foo".

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *