Fork me on GitHub

The WebDevil

Enjoy development

Задавал я недавно нескольким девелам простой, казалось бы, вопрос. Но на него не отвечали.


А вопрос такой: “Вот допустим, получили мы данные из формы, сразу же натравили на них addslashes(), отправили все это дело… не в БД, а на экран. И мы видим, что addslashes() применился дважды. Но смотрим в код – единожды. Почему такое случилось?”

А случится такое могло из-за того, что не проверили перед тем, как применять addslashes, установлены ли magic_quotes.

“Магические кавычки” – это, казалось бы, очень полезная вещь. Вы получаете данные из формы – и они уже с добавленными бэкслешами. Чего ж тут думать, берем и вносим их сразу в БД, подумали бы некоторые. И через пару дней работы такого сайта получим SQL-Injection или ошибки при выводе данных.

И вот зная это, надо было проверить, включены ли “магические кавычки”, и только после этого применять addslashes(). Кслову, я бы предпочел использовать mysql_real_escape_string() вместо кавычек.

Ну вот и ответ на вопрос. А для более любопытных – http://www.webmasterstop.com/63.html.

PS: а в PHP6 “магических кавычек” не будет. Все данные, как им и полагается, будут попадать в скрипт такими, какими их ввели. И по-моему это заставляет задуматься о фильтрации данных своими силами, что есть правильно.

6 Responses to “magic quotes”

  1. А по-моему очень удобно.
    Вот к примеру есть у тебя формочка, туда написали, допустим

    Вова\nПутин

    Просабмитили. Что ты получил? Строку “Вова\nПутин”, которую собственно и сабмитили. Юзер ведь не имел в виду перевод строки, верно? ;)

    anton

  2. Оно-то конечно может и удобней.
    А кто говорит, что я буду вот так сразу проверять на эту строку? Я сам сделаю вырезание всего лишнего, или экранирование этого. Потому как полагаться на магические кавычки – все-равно надо перепроверять, а включены ли они. И что делать, если на горе-хостинге они выключены? Админ же не будет ради одного сайта их включать.

    dm

  3. “И что делать, если на горе-хостинге они выключены? Админ же не будет ради одного сайта их включать.”

    A string ini_get ( string varname ); i string ini_set ( string varname, string newvalue ); ne pomojet dlya borby s etim v nachale scripta?

    Ili ya chto-to ne tak ponimayu?

    P.S. sorry za translit

    Kostiantyn Sokolinskyi

  4. Я обычно в конфиге (файл, который инклудится во все скрипты проекта) ставлю такую строку:
    if(get_magic_quotes_gpc()!=1) die(“Security error! Contact developer.”);
    и ни о чём не беспокоюсь :)

    А по поводу PHP6.. сомневаюсь что магических кавычек там не будет. Скорее всего они просто по умолчанию буду выключены (например как выключены auto_globals).

    #Dialer

  5. ну, зачем же так жестко – сразу сикьюрити эрор.
    чем такой вариант инклуда в index.php плох?

    function array_addslashes(&$item, $key){
    if(is_array($item)){
    array_walk($item, ‘array_addslashes’);
    }else{
    $item = addslashes($item);
    }
    }

    if(!get_magic_quotes_gpc()){
    array_walk($_POST, ‘array_addslashes’);
    array_walk($_GET, ‘array_addslashes’);
    array_walk($_COOKIE, ‘array_addslashes’);
    }

    Alex

  6. юзайте filter и будет вам счастье =)
    Скоро опишу работу с этим расширением ;-)

    dm

Leave a Reply