Заставить код работать с глобальными регистрами отключено


Я унаследовал некоторый устаревший PHP-код, который был написан еще в те времена, когда использование было стандартной практикой register_globals ( Начиная с PHP 4.2.0, эта директива по умолчанию отключена, выпущена 22. Апрель 2002).

Теперь мы знаем, что включение этой функции вредно для безопасности. Проблема в том, как мне найти все места в коде, где мне нужно использовать $_GET или $_POST? Моей единственной мыслью было настроить отчеты об ошибках, чтобы предупреждать о неинициализированных переменных, а затем протестировать каждую часть сайта. Существует ли более простой способ? Должен ли я проверять каждый путь кода на сайте или PHP будет выдавать предупреждения на основе файла?

Author: hakre, 2008-08-09

4 answers

Если вы установите для сообщения об ошибках значение E_ALL, в журнале ошибок появится предупреждение о неопределенных переменных с именем файла и номером строки (при условии, что вы регистрируетесь в файле). Однако он предупредит только в том случае, если столкнется с неопределенной переменной, поэтому я думаю, что вам придется протестировать каждый путь кода. Запуск php из командной строки, похоже, также не помогает.

Существует инструмент отладки под названием xdebug, я его не пробовал, но, может быть, это может быть полезно?

 5
Author: Marie Fischer, 2008-08-09 08:11:55

Я написал сценарий , используя встроенные функции токенизатора. Это довольно грубо, но это сработало для базы кода, над которой я работал. Я полагаю, что вы также могли бы использовать CodeSniffer.

 3
Author: grom, 2008-08-11 01:08:56

Вы можете вручную "подделать" эффект глобальных регистров, но добавить некоторую безопасность. (Я частично взял это из вилки osCommerce под названием xoops)

//  Detect bad global variables
$bad_global_list = array('GLOBALS', '_SESSION', 'HTTP_SESSION_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_REQUEST', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_FILES', 'HTTP_POST_FILES');
foreach ($bad_global_list as $bad_global ) {
    if ( isset( $_REQUEST[$bad_global] ) ) {
        die('Bad Global');
    }
}

//  Make global variables
foreach ($_REQUEST as $name -> $value) {
    $$name = $value; // Creates a varable nammed $name equal to $value.
}

Хотя вы хотели бы настроить его, чтобы сделать ваш код более безопасным, по крайней мере, добавив ваши глобальные переменные конфигурации (например, путь и базовый URL) в список плохих глобальных параметров.

Вы также можете использовать его для простого составления списка всех используемых переменных get/post, чтобы помочь вам в конечном итоге заменить все вхождения, скажем, $return_url, с помощью $_REQUEST['return_url];

 2
Author: Eric Goodwin, 2008-08-17 17:36:54

Я знаю, что есть способ установить значения php.ini для этого скрипта с помощью определенной команды, поэтому я пошел искать и тоже нашел это - Перейти к последнему сообщению на странице

Я также нашел следующий пост, который может быть полезен - Перейти к последнему сообщению на странице

Я добавлю к этому еще, если никто не нашел ответа, но теперь я должен сесть на поезд.

 0
Author: Teifion, 2008-08-09 07:01:06