register_globals = On опасно?

Тема в разделе "PHP", создана пользователем Vitaliyzp, 20 мар 2009.

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

    Vitaliyzp Постоялец

    Регистр.:
    24 янв 2008
    Сообщения:
    56
    Симпатии:
    9
    Сейчас делаем сайт на joomla, ей в приниципе этот параметр не критичен. Но на нашем сервере есть старые сайты, которые не работают, если выключить register_globals.
    Большая ли это дыра в безопастности сервера? И много ли нужно перелопатить кода движка, чтобы он заработал при register_globals = Off ?
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Ознакомившись с материалами, приведенными в http://www.phpclub.ru/detail/article/globals, вы получите представление о том, откуда в PHP появляются переменные и как перейти на стандарт register_globals = Off.

    Для информации по проблемам безопасности, связанных с register_globals, читайте Использование register_globals в главе Безопасность.
     
  3. ahurafenix

    ahurafenix Писатель

    Регистр.:
    14 дек 2008
    Сообщения:
    7
    Симпатии:
    0
    Переделывайте скрипты под настройку register globals в Off. В 6й версии PHP эта настройка убрана с установленным по умолчанию Выключено.
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    эмуляция директив
    PHP:
    /**
    * Эмуляция register globals = off
    */
    function unregister_globals () {
        
    $REQUEST $_REQUEST;
        
    $GET $_GET;
        
    $POST $_POST;
        
    $COOKIE $_COOKIE;
        if (isset ( 
    $_SESSION )) {
            
    $SESSION $_SESSION;
        }
        
    $FILES $_FILES;
        
    $ENV $_ENV;
        
    $SERVER $_SERVER;
        foreach (
    $GLOBALS as $key => $value) {
            if ( 
    $key != 'GLOBALS' ) {
                unset ( 
    $GLOBALS $key ] );
            }
        }
        
    $_REQUEST $REQUEST;
        
    $_GET $GET;
        
    $_POST $POST;
        
    $_COOKIE $COOKIE;
        if (isset ( 
    $SESSION )) {
            
    $_SESSION $SESSION;
        }
        
    $_FILES $FILES;
        
    $_ENV $ENV;
        
    $_SERVER $SERVER;
    }
    а обратная процедура это изъятие всех элементов
     
  5. NoN

    NoN Постоялец

    Регистр.:
    25 ноя 2008
    Сообщения:
    79
    Симпатии:
    33
    Думаю это не так критично к смописным ресурсам, так как нет доступа к исходному коду, неизвестно какую переменную куда нужно вставить, а для готовых двигалов, это поненцеальная опасность...
    Хостинги постепенно начинают отказыватся от Рег. Глобалс, например Mastehost c месяц назад перевел все сайты в Reg Glob=OFF, пришлось прописывать везде... через .htccess php_flag register_globals on
     
  6. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    312
    обычно, если скрипт пишется на скорую руку, бывают примерно такие ошибки:
    PHP:
    if($_GET['id']==intval($_GET['id'])){
      
    mysql_query("select .... from ... where id=$id");
    }
    Т.е. проверяется только параметр $_GET['id']. Но если послать вместе с $_GET['id'] еще и $_POST['id'], то можно провести sql-inj и т.п.
    Но если скрипты изначально были заточены для безопасности, то волноваться не стоит. ;)
     
  7. 1d37r

    1d37r Читатель

    Заблокирован
    Регистр.:
    16 сен 2007
    Сообщения:
    287
    Симпатии:
    48
    Регистр-глобал = ОН опасен только для криворуких программистов. Если ты будешь на достаточном уровне фильтровать GPC и не будешь держать неприсвоенные переменные в скрипте, то все тру и волноваться тебе не о чем
     
  8. jID

    jID Постоялец

    Регистр.:
    12 фев 2008
    Сообщения:
    106
    Симпатии:
    31
    Выключение глобалсов обязывает программиста более внимательно относиться к передаваемым переменным.
    Кроме того, исключает множество ошибок, когда программист забыл проверить переменную перед использованием.
    Как правило, в первых скриптах после "hello, world!" программисты начинают использовать переменные, и конечно их не проверяют.
    Без глобалсов значения переменных нужно специально выбирать в зависимости от выбранного метода полечения их скриптом (GET, POST или COOKIE).

    Всё что идёт в запрос SQL должно фильтроваться.
    Приведённый пример сработает только при включённых глобалсах или если $id чему-то равен до этого кода.
    Ошибка программиста в том, что он не "вспомнил" о методах POST и COOKIE, а также о том, что значение (intval($_GET['id']) == $_GET['id']), если даже ничего в GET нет, будет true.

    В приведённом примере достаточно поменять код на:
    PHP:
    $id=intval($_GET['id']);
    if (
    $id) {
      
    mysql_query("select .... from ... where id=$id");
    }
    чтобы исключить опасный конфуз возможностью инъекта через POST.
     
  9. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    У джумлы есть свой эмулятор register_globals.
     
Статус темы:
Закрыта.