???????? ???????????????? ?? ????????

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

Здесь лучше не дискутировать. Здесь лучше давать правильные советы.

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

Сообщение Аза » Вс фев 13, 2005 19:23 pm

(кому нужно, тот поймёт)

\"Надоедливые наклонные\", слеши, экранирование кавычек.

Слеш, от английского 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. (Спасибо .des. за идею.) Здесь надо сделать небольшое отступление. Перебор массива $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);




Внимание! Если Вы выключили magic_quotes и работаете с базой данных - будьте бдительны! Обязательно, самому - не надеясь на PHP, какими угодно средствами, надо выполнять оба требования: заключать любые значения полей, подставляемые в запрос, в кавычки, и экранировать в них спецсимволы. Иначе проблемы неизбежны.
Правила экранирования могут отличаться для других СУБД.

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


<input type="text" name="name" value="<? echo htmlspecialchars($name,ENT_QUOTES)?>">
Аза
Just cent
 
Сообщения: 415
Зарегистрирован: Сб янв 08, 2005 11:52 am


Сообщение White_bear » Вс фев 13, 2005 19:54 pm

спасибо
Аватара пользователя
White_bear
Терминатор Немо
 
Сообщения: 1876
Зарегистрирован: Вс ноя 02, 2003 17:32 pm
Откуда: Янтарное королевство


Вернуться в Полезная информация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Яндекс.Метрика