экранирование "магических кавычек"

Тема в разделе "PHP", создана пользователем saen, 2 июн 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    написал скрипт экранирования магических. Хотелось бы узнать у знатоков, насколько верный и безопасный код получился)



    PHP:
    set_magic_quotes_runtime(0);

    if(
    get_magic_quotes_gpc())
    {
        if(
    is_array($_GET))
        {
            while (list(
    $k$v) = each($_GET))
            {
                if (
    is_array($_GET[$k]))
                {
                    while(list(
    $k2$v2) = each($_GET[$k]))
                    {
                        
    $_GET[$k][$k2] = addslashes($v2);
                    }
                    @
    reset(@$_GET[$k]);
                }
                else
                {
                    
    $_GET[$k] = addslashes($v);
                }
            }
            @
    reset(@$_GET);
        }
        if(
    is_array($_POST))
        {
            while(list(
    $k,$v) = each($_POST))
            {
                if(
    is_array($_POST[$k]))
                {
                    while(list(
    $k2$v2) = each($_POST[$k]))
                    {
                        
    $_POST[$k][$k2] = addslashes($v2);
                    }
                    @
    reset(@$_POST[$k]);
                }
                else
                {
                    
    $_POST[$k] = addslashes($v);
                }
            }
            @
    reset(@$_POST);
        }
        if(
    is_array($_COOKIE))
        {
            while(list(
    $k$v) = each($_COOKIE))
            {
                if(
    is_array($_COOKIE[$k]))
                {
                    while(list(
    $k2$v2) = each($_COOKIE[$k]))
                    {
                        
    $_COOKIE[$k][$k2] = addslashes($v2);
                    }
                    @
    reset(@$_COOKIE[$k]);
                }
                else
                {
                    
    $_COOKIE[$k] = addslashes($v);
                }
            }
            @
    reset(@$_COOKIE);
        }
        if(
    is_array($_SERVER))
        {
            while(list(
    $k$v) = each($_SERVER))
            {
                if(
    is_array($_SERVER[$k]))
                {
                    while(list(
    $k2$v2) = each($_SERVER[$k]))
                    {
                        
    $_SERVER[$k][$k2] = addslashes($v2);
                    }
                    @
    reset(@$_SERVER[$k]);
                }
                else
                {
                    
    $_SERVER[$k] = addslashes($v);
                }
            }
            @
    reset(@$_SERVER);
        }
    }
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Очередной быдлокод - про магические кавычки надо забыть вовсе.
     
  3. localhost:80

    localhost:80 Постоялец

    Регистр.:
    4 дек 2008
    Сообщения:
    102
    Симпатии:
    15
    юзай mysql_real_escape_string() или mysql_escape_string() когда ложишь текст в базу, а в остальном кавычки вроде нигде не помешают больше
     
  4. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Ты че такой злой? раздел называется "php для начинающих" а не "обсирание чужого кода". или ты таким образом посты набираешь?
     
  5. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Я добрый :p
    Моё выражение - констатация факта, а не обсирание.
    От того, что ты начинающий, код лучше не станет.

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

    О да, мне это жуть как необходимо :D
     
  6. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    кстати, ТС, есть такие функции как array_walk, array_map тыб почитал на досуге..

    а так, для БД юзай mysql_real_escape_string (она безопасней чем mysql_escape_string, т.к. учитывает кодировку соединения) и не будет никаких проблем.

    вообще, для предотвращения sql инъекций достаточно такого кода:
    $integer = intval($var);
    $string = mysql_real_escape_string($var);

    и все, этого хватит....и не надо делать громоздкие проверки, условия и т.д.
     
  7. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Для saen ...Магические кавычки это зло от которого надо избавляться обрабатывайте все входящие данные $_GET $_POST...через функцию
    PHP:
    if (get_magic_quotes_gpc()== 1)
    {
      function 
    s_slash($v)
      {
        if (
    is_array($v))
        return 
    array_map('s_slash'$v);
        return 
    stripslashes($v);
      }
            if (!empty(
    $_GET))     $_GET     s_slash($_GET);
            if (!empty(
    $_POST))    $_POST    s_slash($_POST);
            if (!empty(
    $_COOKIE))  $_COOKIE  s_slash($_COOKIE);
            if (!empty(
    $_REQUEST)) $_REQUEST s_slash($_REQUEST);
    а затем обрабатывайте как надо те если числа то intval numeric
    а при внесение их в БД mysql_real_escape_string
    при выводе в браузер htmlspecialchars
     
  8. noiz

    noiz Создатель

    Регистр.:
    9 апр 2009
    Сообщения:
    16
    Симпатии:
    1
    serginio вроде оптимальную функцию написал, я пользуюсь подобной, и ни разу не подводила.

    Совет забыть о магических кавычках конечно хороший, но далек от практики: на разных хостингах разные настройки, на которые клиенты влиять не в силах, особенно там, где поддерживается работоспособность старых скриптов.
     
  9. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Вот как раз из-за того, что на разных хостингах разные настройки, и стоит забыть про magic_quotes :D
    В конце концов, скоро эти магические кавычки станут уже историей.

    Эскейпить все суперглобальные массивы, затея тоже далёкая от оптимальности.
     
  10. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Какой вариант можешь предложить?
     
Статус темы:
Закрыта.