2015-03-02 4 views
0

Я хотел бы запретить php-скриптам изменять содержимое глобального $_SERVER.

В частности, я не хочу, чтобы

unset $_SERVER['foo']; 

, но было бы неплохо, чтобы запретить какой-либо модификации, например, модуль или объявление php.ini.

Есть ли один?

+0

Я думаю, было бы полезно знать причину этого. – M1ke

ответ

0

Если вы в управлении скрипта корневого уровня вы можете просто скопировать его:

$_my_server = $_SERVER; 

Я думаю, что было бы полезно знать причину для этого; переменная $_SERVER не должна изменяться включенными сценариями, потому что редко кто-то нуждается в ее изменении. Он создается во время выполнения, поэтому любые изменения не сохраняются для последующих прогонов скрипта.

Кроме того, ваш дополнительный пункт о php.ini декларации является немного более запутанным - точка многих COMPONENTES из $_SERVER Сообщаем скрипты об этих заявлениях, так что наличие его отправить поддельные данные будут казаться очень нечетным случай использования и, возможно, не представляется возможным.

+0

Что я делаю, я держу базу данных аутентификации с электронной почтой пользователя и передаю хэши в отдельной базе данных с основной платформы веб-приложений. Когда обработчик, который управляет этим db, будет подключен, плагины не будут использоваться, и наоборот, но скрипт ajax для плагина может, поэтому я использую SetEnv для установки переменной apache в каталогах, которые содержат плагины ajax-скриптов, поэтому аутентификация db обработчик может отказаться от подключения, если он присутствует, но если сценарий ajax его отключает, проверка не выполняется. –

+0

OK; как это связано с супер-глобальным? $ _SERVER'? Вы уверены, что не думаете о '$ _SESSION'? – M1ke

+0

Да - в директиве apache DirectoryMatch, которая позволяет плагину иметь ajax-скрипты, я использую SetEnv для установки переменной сервера. Таким образом, в моем скрипте, который загружает базу данных аутентификации, он может проверить наличие этой переменной сервера и выйти без загрузки обработчика базы данных аутентификации. Но простой unset побеждает его. К сожалению, нельзя определить константу php в директиве apache DirectoryMatch. Переменная $ _SERVER лучше всего делать. –

0

Насколько я знаю. Если вы полагаетесь на содержимое $ _SERVER во всем своем коде и не хотите, чтобы другой код (плагин?) Изменял его, лучшим вариантом является создание копии на этапе начальной загрузки вашего приложения, а затем использование этой копии на протяжении всего вашего код:

$serverDetails = $_SERVER; 

$foo = $serverDetails['foo']; 
+0

Сценарии ajax плагина не зависят от моего веб-приложения, они загружают только те части платформы, в которых они нуждаются, - помогают поддерживать их быстро, не запуская кучу ненужного кода, просто чтобы сделать что-то простое. Хорошо, я надеялся, что есть модуль PECL или что-то, что может защитить _SERVER. –

+0

Я предполагаю, что мне придется изменить способ его выполнения и использовать оболочку для плагина Ajax, который определяет константу, а затем требует айакс плагина, а не использование DirectoryMatch, чтобы разрешить скрипты ajax для плагина. –

Смежные вопросы