AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







Магические кавычки


Так называемые "магические кавычки" (magic_quotes_gpc), это одна из ошибок разработчиков языка. Получилось это по принципу "хотелось как лучше, получилось как всегда". Дело в том, что при взаимодействии PHP с базами данных, запрос передается простым текстом. А в языке SQL используются кавычки и апострофы. Так вот что бы они не испортили запрос, будучи полученными по HTTP протоколу от юзера, их нужно экранировать обратным слэшем.

Разработчики языка решили облегчить жизнь программистам, и придумали такую директиву. Если этот механизм включен, все поступающие извне кавычки и апострофы будут немедленно и безоговорочно экранированы. Это касается суперглобальных массивов GET, POST и COOKIE. Ну и как производный REQUEST.
Отсюда и эти три буквы magic_quotes_gpc

Благое вроде намерение, но что оказалось. Данные, поступающие в скрипт, совсем не обязательно должны попасть в БД. А бэкслэш им уже приляпан. Вот давайте посмотрим.
Откройте блокнот и напишите туда это:
php_flag magic_quotes_gpc On
И сохраните в корне хоста с названием .htaccess Прямо так, одно расширение.
Теперь сделаем такой скриптик:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php



if(!empty($_POST['ok'])) 
    echo 
$_POST['text']; 
?> 
<form action="" method="post"> 
<input name="text" type="text" /> 
<input name="ok" type="submit" /> 
</form>


Вот если теперь написать в поле O'Rally, старого знакомого, то получится O\'Rally, что совсем не одно и то же.

По этому нужно эту директиву отключить сразу и не надеяться на магию. Кроме того, в 6-й версии php эта директива будет убрана совсем.

Делается это в том же файле .htaccess, просто поставив значение Off
php_flag magic_quotes_gpc Off


А еще лучше сделать это в скрипте, что бы он не зависел от внешних настроек. Делается это так:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php


/** 
* We kill magic inverted commas 
* Убиваем магические кавычки 
*/         
    
function stripslashesDeep($data)     
    {     
        if(
is_array($data))      
            
$data array_map("stripslashesDeep"$data);      
        else    
            
$data stripslashes($data);      
        return 
$data
    } 

    if(
get_magic_quotes_gpc())  
    {  
        
$_GET stripslashesDeep($_GET);   
        
$_POST stripslashesDeep($_POST);   
        
$_COOKIE stripslashesDeep($_COOKIE); 
        
$_REQUEST stripslashesDeep($_REQUEST); 
    }


Тоесть мы смотрим, включена ли директива. Если да - рекурсивно очищаем массивы от бэкслэшей.

Вот и вся недолга. Магия в сказках хороша, а тут нужно только на себя надеяться

Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009