mysql_escape_string — Экранирует SQL спец-символы для mysql_query.

Содержание

FPublisher

Web-технологии: База знаний

Документация PHP

mysql_escape_string

(PHP 4 >= 4.0.3, PHP 5, PECL mysql:1.0)

mysql_escape_string — Экранирует SQL спец-символы для mysql_query.

Описание

string mysql_escape_string ( string $unescaped_string )

Функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query().

Замечание: mysql_escape_string() не экраинрует % и _. Функция идентична mysql_real_escape_string(), исключая то, что mysql_real_escape_string() принимает параметром ещё и указатель на соединение и экранирует в зависимости от кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.

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

= «Zak’s Laptop» ;
$escaped_item = mysql_escape_string ( $item );
printf ( «Escaped string: %s\n» , $escaped_item );
?>

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

Что делает функция «mysql_real_escape_string()» и для чего она нужна

29.10.2012, 02:08

Для чего используются «virtual_path» и «ifelse:system_enable_fancy_urls»?
Приветик, народ! Помогите, плиз, разобраться со строчкой. Есть движок сайта, все ссылки и пути к.

Скажите что делать новичку ! С чего начать изучение» вебкрафта» =)
Привет, хочу начать создавать такие сайты на подобие этого http://schastye.com/restaurants Что.

Для чего нужна это функция?
Мне нужно разобрать чужой код и не могу понять для чего используется это функция: function.

Что делает функция compare в коде и зачем она нужна в qsort
Объясните, пожалуйста, что делает функция compare (17 строка) в данном случае и зачем она нужна в.

Опция «SHARE» — для чего она
Здравствуйте. Собственно я создал этот топик, потому что не могу разобраться с функцией «share».

mysql — экранирование специального символа из строки в переполнении стека

мы пытаемся убрать какой-то специальный символ из нашей строки, пожалуйста, скажите мне, какую функцию мы должны использовать
например HTC Desire 210 — Белый
В этом примере мы экранируем — (дефис) специальный символ.
В приведенном выше примере у нас много названий продуктов с разными специальными символами, которые мы избегаем.
спасибо за ваше сотрудничество.

Решение

Ты можешь использовать str_replace , например ;

Другие решения

Функция mysqli_real_escape_string () экранирует специальные символы в строке для использования в операторе SQL.

Синтаксис:

пример Избегайте специальных символов в строке:

соединение Необходимые. Определяет соединение MySQL для использования

escapestring Необходимые. Строка для экранирования. Кодируются следующие символы: NUL (ASCII 0), \ n, \ r, \, ‘, «и Control-Z.

Передайте строку в этой функции.

Для получения дополнительной информации, проверьте это Удалить специальный символ — Stackoverflow

используйте системную функцию $ city = $ mysqli-> real_escape_string ($ city);

Вы можете избежать специальных символов в MySQL, используя функцию mysqli_real_escape_string () .

mysqli_real_escape_string (соединение, escapestring);

Вы также можете использовать addslashes () который возвращает строку с обратной косой чертой, добавленной перед такими символами, как:

  • одиночная кавычка (‘)
  • двойная кавычка («)
  • обратная косая черта (\)
  • NUL (байт NUL)

Но addslashes() имеет некоторые уязвимости к инъекциям sql для подробностей, см. ответ на этот вопрос Примеры SQL-инъекций через addlashes () , так лучше использовать mysqli_real_escape_string() функция.

Или если вы хотите экранирующие символы для регулярных выражений тогда вы можете использовать
preg_quote (строка $ str [, строка $ delimiter = NULL]) , который ставит обратную косую черту перед каждым символом, который является частью регулярного выражения синтаксис.
символы регулярного выражения: . \ + *? [^] $ () <> =! | : —

Замечания: Но будь осторожен preg_quote() не убежит single(‘) или же double quote(«) ,

mysql_escape_string и addslashes

Ознакомился с FAQ, но вот чего не понял: в чем принципиальное отличие addslashes и mysql_escape_string?

3 ответа

Да и еще забыл добавить сюда strip_tags. Распижите, плиз, эти функции попдробнее: где и когда их применять надо, и в чем их различие?

Originally posted by MiKar
Да и еще забыл добавить сюда strip_tags. Распижите, плиз, эти функции попдробнее: где и когда их применять надо, и в чем их различие?

chitaem vnimatel’no MAN ;)

mysql_escape_string — Экранирует SQL спец-символы для mysql_query.
mysql_escape_string() не экраинрует % и _.

addslashes — Экранирует спецсимволы в строке
Экранируются одиночная кавычка (‘), дойная кавычка («), обратный слэш (\) и NUL (байт NULL).

Илон Маск рекомендует:  Атрибут ismap в HTML

strip_tags — Удаляет HTML и PHP тэги из строки

mysql_escape_string

(PHP 4 >= 4.0.3, PHP 5, PECL mysql:1.0)

mysql_escape_string — Экранирует SQL спец-символы для mysql_query.

Описание

Функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query().

Замечание: mysql_escape_string() не экраинрует % и _. Функция идентична mysql_real_escape_string(), исключая то, что mysql_real_escape_string() принимает параметром ещё и указатель на соединение и экранирует в зависимости от кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.

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

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

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Страниц: 1

#1 13.07.2010 18:44:21

Экранирующие символы при вставке данных

Меня интересует алгоритм работы mysql с экранирующими символами (косая черта \).
Работаю на php, поэтому вопрос связан с синтаксисом в php.
Вопросы:
1) Обязательно ли использовать обратный слеш для экранирования спецсимвлов и какие символы должны экранироваться?

2) можно ли отключить (например, администратором или при установке mysql) экранирование специсимволов? Т.е. если я напишу select * from tbl where a=’10\’ будет ли это восприниматься как ошибка, или прямо в таблице будет искаться точно такая строка «10\», в которой будет 10 и обратный слеш?

Если кратко можно сформулировать вопрос, то он заключается в том, как роль у обратного слеша в mysql запросах? Как он воспринимается mysql и есть ли настройки, управляющие этим поведением?

Отредактированно sito-corito (13.07.2010 18:45:35)

#2 13.07.2010 20:40:45

Re: Экранирующие символы при вставке данных

Роль — экранирование. Следующий за \ символ будет считаться ровно тем символом.
Т.е. \a — это a, а \\ — это \. При этом если там стоит апостроф, кавычка или символ
с кодом ноль, то эти символы теряют свои магические значения внутри строки.

Для того, чтобы не придумывать себе головную боль в PHP, используйте addslashes().

#3 15.07.2010 18:19:29

Re: Экранирующие символы при вставке данных

А какая роль такой кавычки ` в mysql-запросах?

#4 15.07.2010 18:21:45

Re: Экранирующие символы при вставке данных

В бэктики заключаются имена таблиц и столбцов, если они могут быть трактованы
как-то иначе (например, колонку `date` никаким другим способом не создашь).

#5 30.08.2010 18:46:48

Re: Экранирующие символы при вставке данных

В PHP есть одна функция http://php.net/manual/en/function.mysql … string.php
На русском про функцию можно прочитать здесь: http://www.php.ru/manual/function.mysql … tring.html. Для чего он нужна (она экранирует специальные символы \x00, \n, \r, \, ‘, » и \x1a)? С кавычками понятно — они нужны для того, чтобы обезопасить от sql инъекций. А для чего экранировать спецсимволы вроде \n? Когда нужно применять эту функцию, а когда addslashes()? Подскажите, пожалуйста.
Если спецсимвол \n помещается в базу, то он так туда и поместиться. А если помещать \\n, то что это тогда в базе будет?

Отредактированно sito-corito (30.08.2010 18:50:44)

#6 30.08.2010 21:51:26

Re: Экранирующие символы при вставке данных

Разработчики PHP — обычные люди. Когда они портируют библиотеку, они не читают
документацию, они работают в режиме робота. А вот в документации написано:

Strictly speaking, MySQL requires only that backslash and the quote character used to
quote the string in the query be escaped. This function quotes the other characters to make
them easier to read in log files.

#7 15.12.2010 22:48:51

Re: Экранирующие символы при вставке данных

С поведением все понятно. Интересно было бы увидеть ответ на вторую половину вопроса «есть ли настройки, управляющие этим поведением?»

#8 17.12.2010 15:18:36

Re: Экранирующие символы при вставке данных

Очевидно, нет, раз они не документированы

Страниц: 1

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson

PHP: mysql_escape_string()

Есть ли функция обратная сабжевой?
При выводе информации обработанной функцией mysql_escape_string() отображаются \», \’ и т.д.

Как провести обратное преобразование?

Re: PHP: mysql_escape_string()

Re: PHP: mysql_escape_string()

Вы не поняли вопроса.
Основное внимание принадлежит PHP, а не MySQL.

Человек вводит данные через HTML-форму.
Я пропускаю введенные данные через mysql_escape_string().

Потом хочу отобразить то что он ввел. Если он употреблял спец-символы типа ‘ » и т.д., то они будут отображаться как \’ \».

Как мне произвести обратное преобразование?

Re: PHP: mysql_escape_string()

Так Вы спец. символы с помошью mysql_escape_string() зачем экранируете? Наверное, для того, чтобы отправить эти данные в mysql таблицу. Так отправьте, а затем, когда Вы их из нее получите, экранирующих «\» не будет. Попробуйте сначала, а уж если они все-таки будут ( я сильно удивлюсь, у меня их нет ) покажите код.

Re: PHP: mysql_escape_string()

$query = ‘INSERT INTO topics VALUES («», «‘.$forum_id.'», «‘.$owner_id.'», «‘.$f_title.'», «‘.mysql_escape_string($f_body).'», «‘.date(‘Y-m-d’).'», «‘.getenv(«REMOTE_ADDR»).'», «0», false)’;
$result = mysql_query($query, $link);

Re: PHP: mysql_escape_string()

Я читал про то что экранирование спец. символов не влияет на хранение текста в самой БД.

Но выходит обратное — при отображении в php скрипте получается \’ \»

Может есть особые настройки MySQL?
У меня все настройки дефолтовые.

Re: PHP: mysql_escape_string()

Не влияет. Я не могу себе представить настроек, которые бы на это влияли, потому что с ними почти никакая программа работать не смогла бы.

Re: PHP: mysql_escape_string()

Re: PHP: mysql_escape_string()

Вообще, если все-таки Вы действительно их видите, возможно просто спец. символы экранируются дважды?

попробуйте в $f_body записать строку, содержащую одинарную кавычку, и сделать этот же запрос, но без mysql_escape_string(). Запрос должен заверниться ошибкой. Если так и будет, значит mysql_escape_string лишний раз вызывется еще где-то. Если нет — значит действительно некие настройки установлены, и из-за них спец. символы экранируются автоматически. Но я таких настроек на знаю и не могу найти никакого описания на эту тему. Думаю, что все-таки первое.

Илон Маск рекомендует:  Что такое код ovrimos_rollback

Re: PHP: mysql_escape_string()

Что происходит вот здесь:

Если написать тестовый скрипт:

то все выводится как надо.
Делаю поиск в скрипте на слово escape, находит только одно упоминание, так что чудеса какие-то.

Re: PHP: mysql_escape_string()

Перед запросами БД делаю вот что:

$f_title = strip_tags($f_title);
$f_body = strip_tags($f_body);
$f_body = str_replace(«\n», »
«, $f_body);

Это ведь не может повлиять?

Re: PHP: mysql_escape_string()

Re: PHP: mysql_escape_string()

>Что происходит вот здесь:

из результата запроса вытаскивается один столбец и возвращается в виде неассоциативного массива, который раздирается на компоненты. Мне так удобнее. :) Подробности в доках на php :)

PHP защита полей от SQL инъекций

#1 Шальной

#2 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Шальной (26 Март 2013 — 05:53) писал:

    #3 Шальной

    #4 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Шальной (26 Март 2013 — 08:09) писал:

    #5 kashirinav

    Андрей, добрый день!
    Потихоньку я перебрался в эту часть форума />. Сейчас изучаю php и по ходу внедрения изученного в свой сайт возникают вопросы.
    Один из таких вопросов мучает долго — использование функции htmlspecialchartы(). Учитывая мой опыт по борьбе с вирусами на сайте, пытаюсь максимально защитить его.
    У меня на сайте есть несколько он-лайн сервисов по расчету normirovanie-truda.ru/optimizaciya-chislennosti/. В них есть поля ввода.
    После ввода хочу обработать полученную информацию с помощью вышеуказанной функции. Пока все попытки безуспешны.
    Вот код:
    Функция explodeX позволяет мне учитывать разные варианты разделителя.
    Пытаюсь вставить htmlspecialchartы() в начале строки
    Выдает ошибку.
    Подскажите, плиз:
    1. Нужна ли мне вообще такая защита и поможет ли мне она от SQL инъекций (прочитал только что) и всяких нехороших запросов?
    2. В каком месте кода должна находится функция htmlspecialchars?
    Спасибо!

    P.S. сейчас переписал код и вставил htmlspecialchars перед $_POST, ошибка ушла. Но как проверить работает ли функция htmlspecialchars или нет?

    #6 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Привет, мир!

    #7 kashirinav

    #8 matroskin8

  • Администраторы
  • 12 409 сообщений
  • kashirinav (19 Июль 2013 — 11:17) писал:

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

    kashirinav (19 Июль 2013 — 11:17) писал:

    #9 kashirinav

    Андрей, здравствуйте!
    Пытаюсь оптимизировать код блога и хочу вынести часто используемые функции в файл «function».
    Есть функция explodeX, используется в трех файлах. Сейчас она вставлена в каждый из этих файлов.
    Файлы получают из формы данные и выводят результат обработки в новую страницу.
    Прописал функцию explodeX в function.
    В файлах обработки пишу такую строку:
    Далее проверяю свой массив print_r($hum1); и ничего нет.
    В чем моя ошибка?

    #10 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Здравствуйте.
    Если сам массив $hum1 создался, но он пуст, то это один вопрос. Здесь нужно проверять входящие данные и корректность работы функции.
    Если же не создается и сам массив, тогда, скорее всего, проблема именно в корректности работы функции.
    Дебаг лучше в таких случаях проводить функцией var_dump(), которая не только покажет содержимое, но и его тип:
    Также возможен вариант, что попросту в этом файле не видна данная функция. в таком случае можно пропустить проверку на существование функции. вообще, на этапе разработки иногда лучше пропускать подобные проверки, тем самым облегчая процесс дебагга приложения:

    #11 kashirinav

    #12 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Ну тогда ответ очевиден — при вызове функции о ней ничего не известно, поскольку получаем ответ «нет».
    Только что попробовал у себя поработать с пользовательской функцией. В файле functions.php прописал:
    Ну и в нужном шаблоне (например, index.php) спокойно работаю с результатом функции:

    #13 Гость_Sokol Skye_*

    Шальной (26 Март 2013 — 05:53) писал:

    #14 Artex

    Ну я, например, делаю вот в такой последовательности:

    И сама функция clear():

    Не думаю, что возможна инъекция. Касательно mysql_real_escape читал, что сильно грузит сервер (или что-то другое ).

    #15 Гость_Sokol Skye_*

    #16 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Sokol Skye (11 Октябрь 2013 — 15:29) писал:

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

    Artex (11 Октябрь 2013 — 15:55) писал:

    #17 Artex

    matroskin8 (11 Октябрь 2013 — 17:52) писал:

    Ну если не сложно, попробуйте привести пример. Все ковычки придут экранированными, то бишь ничего, кроме как строка с текстом в $login не прийдет, но может быть sql запрос, который отфильтруется моей регуляркой, в текущем проекте такой:

    #18 matroskin8

  • Администраторы
  • 12 409 сообщений
  • Artex (12 Октябрь 2013 — 00:10) писал:

    Ну я же не хакер я просто-напросто отметил, что данные функции не предназначены для защиты от sql-инъекций (они предназначены для другого, и я назвал для чего) и вот по какой причине: попробуйте зарегистрировать юзера с логином d’Artanian. а теперь посмотрите, что попало в БД — там будет уже не d’Artanian, а там лежит d’Artanian. т.е. один символ апострофа был заменен на 6 символов его сущности. это не критично, но это уже не хорошо. по той причине, что порой в текстовые поля (типа CHAR / VARCHAR — поля ограниченной длины) должно попадать ровно столько символов, сколько задумывалось, а все лишнее будет просто обрезаться. в то же время функция mysql(i)_real_escape_string() положит туда то, что там и должно быть — кавычку, один символ (а не 6), как и задумывалось.
    Ну а примеры sql-инъекций можно во множестве найти в сети. например, в статье в Википедии. можно увидеть, что sql-инъекции возможны не только для строковых данных, но и для числовых.

    Илон Маск рекомендует:  Что такое код asp serverconfigsslallowencrypt

    Artex (12 Октябрь 2013 — 00:10) писал:

    т.е. логин d’Artanian уже запрещен?
    В общем-то, если использовать такой шаблон, то надобность в функции clear() просто отпадает, поскольку шаблон итак не пропустит ничего, кроме альфа-нумериков.

    mysql_escape_string

    (PHP 4 >= 4.0.3, PHP 5)

    mysql_escape_string — Экранирует строку для использования в mysql_query

    Данная функция объявлена устаревшей в PHP 4.3.0, и, вместе с расширением MySQL, удалена PHP 7.0.0. Вместо нее используйте активно развивающиеся расширения MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API и это FAQ. Альтернативы для этой функции:

    Описание

    Функция экранирует unescaped_string таким образом, после чего её можно безопасно использовать в mysql_query() . Данная функция устарела.

    Функция идентична mysql_real_escape_string() , исключая тот факт, что mysql_real_escape_string() принимает параметром ещё и идентификатор соединения и экранирует строку с учетом текущей кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.

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

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

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

    Список изменений

    Версия Описание
    5.3.0 Данная функция теперь выдает предупреждение уровня E_DEPRECATED.
    4.3.0 Функция помечена как устаревшая, ее не следует больше использовать. Используйте вместо нее mysql_real_escape_string() .

    Примеры

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

    MySQL/PHP — экранирование символов, которые могут замедлить мою базу данных (или заставить ее выполнять неожиданно)

    Я запускаю все свои целые числа через (int)Integer , чтобы сделать их безопасными для использования в моих строках запроса.

    Я также запускаю свои строки через этот код функции: —

    Я, очевидно, возвращаю переменную $cleanedString. Теперь я заменяю символ%, потому что это подстановочный знак для mySQL, и это может потенциально замедлить мои запросы (или заставить их возвращать неверные данные), если пользователь их вставил. Есть ли другие специальные символы для mySQL, о которых я должен беспокоиться?

    Во второй заметке, есть ли что-то неправильное или избыточное в моем поиске и заменить после mysql_real_escape_string ? Я получил его с веб-сайта, когда я только начинал, и (если я правильно помню), он сказал, что вам нужно использовать этот поиск/замену в дополнение к escape-строке. Похоже, что он пытается удалить любые ранее экранированные символы инъекций?

    Да, я думаю, у вас есть вещи, которые немного странно там.

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

    Если вы особенно хотите удалить групповой символ%, вы можете просто избежать этого или вообще удалить его. Прежде чем вставлять строку в SQL-запрос, выполните ее через mysql_real_escape_string, и все будет хорошо.

    Хорошо, у меня есть несколько комментариев:

    Магическая кавычка устарела, ваша среда PHP никогда не должна включать магические кавычки. Поэтому проверка на это не должна быть лишней, если вы не разрабатываете код, который может быть развернут в среде других клиентов, у которых есть (предварительно) активированные магические кавычки.

    Регулярное выражение в preg_match() неверно, если вы ищете последовательности символов. Регулярное выражение типа [xyz] соответствует любому одному из символов x, y или z. Он не соответствует строке xy или yz. Во всяком случае, это академично, потому что я не думаю, что вам нужно вообще искать или заменять специальные символы.

    mysql_real_escape_string() является достаточным для вывода строковых литералов, которые вы намерены интерполировать внутри кавычек в строках SQL. Нет необходимости выполнять замену строк для других котировок, обратных косых черт и т.д.

    % и _ являются подстановочными символами в SQL только при использовании сопоставления шаблонов с выражениями LIKE . Эти символы не имеют смысла, если вы просто сравниваете с операторами равенства или неравенства или регулярными выражениями. Даже если вы используете выражения LIKE , вам не нужно скрывать эти символы ради защиты от SQL-инъекции. Это зависит от вас, если вы хотите рассматривать их как буквенные символы (в этом случае избегать их с обратной косой чертой) или подстановочные знаки в выражении LIKE (в этом случае просто оставить их).

    Все вышеизложенное применяется, когда вы интерполируете переменные PHP в выражения SQL вместо буквенных строковых значений. Escaping вообще не требуется, если вы используете связанные параметры запроса вместо интерполяции. Связанные параметры недоступны в обычном API-интерфейсе «mysql», но только в API-интерфейсе «mysqli».

    В другом случае вы интерполируете переменные PHP вместо имен таблиц SQL, имен столбцов или другого синтаксиса SQL. Вы не можете использовать связанные параметры в таких случаях; связанные параметры заменяются только строковыми литералами. Если вам нужно сделать динамическое имя столбца (например, ORDER BY столбцом предпочтений пользователя), вы должны разграничить имя столбца с помощью обратных кавычек (в MySQL) или квадратные скобки (Microsoft) или двойные кавычки (другой стандартный SQL).

    Итак, я бы сказал, что ваш код можно было бы свести просто к следующему:

    Это, если вы собираетесь использовать строку для интерполяции; если вы собираетесь использовать его как значение связанного параметра, оно еще проще:

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL