Я унаследовал некоторый унаследованный код PHP, который был переписан, когда это было стандартной практикой использования register_globals
(Начиная с PHP 4.2.0 эта директива по умолчанию отключена, выпущена 22 апреля 2002 г.).
Теперь мы знаем, что для безопасности плохо, когда она включена. Проблема в том, как мне найти все места в коде, где мне нужно использовать $_GET
или $_POST
? Моя единственная мысль состояла в том, чтобы установить отчет об ошибках, чтобы предупредить о неинициализированных переменных, а затем протестировать каждую часть сайта. Есть ли более простой способ? Придется ли мне проверять каждый путь кода на сайте или PHP выдаст предупреждение на файловой основе?
Если для сообщения об ошибках задано значение E_ALL, в журнале ошибок он предупреждает о неопределенных переменных, включая имя файла и номер строки (при условии, что вы входите в файл). Тем не менее, он будет предупреждать, только если встретит неопределенную переменную, поэтому я думаю, что вам придется тестировать каждый путь кода. Запуск php из командной строки тоже не помогает.
Существует инструмент отладки с именем xdebug, еще не пробовал, но, может быть, это может быть полезно?
Я знаю, что есть способ установить значения php.ini для этого скрипта с помощью определенной команды, поэтому я пошел и нашел это тоже - Перейти к последнему сообщению на странице
Я также нашел следующий пост, который может быть полезен - Перейти к последнему сообщению на странице
Я добавлю к этому больше, если никто не нашел ответ, но теперь я должен сесть на поезд.
Я написал скрипт, используя встроенные функции Tokenizer . Это довольно грубо, но это работает для базы кода, над которой я работал. Я считаю, что вы также можете использовать CodeSniffer .
Вы можете вручную «подделать» эффект глобальных регистров, но добавить некоторую безопасность. (Я частично взял это из форка 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];