LINUX.ORG.RU

запуск скрипта перед любым другим скриптом в PHP

 


0

1

Как в PHP сделать так, чтобы какой бы скрипт не запускался, перед ним автоматически запустится заранее заготовленный код?

Это должно выглядеть как если бы ВНЕЗАПНО во всех скриптах вначале появилась надпись require_once(«myfile.php»). Но не вручную, а чтобы сервак испоттишка это вставлял.

===

Причина простая. Из нового PHP выпилили register_globals.

Имеется самописный сайт (точнее, часть сайта) с сотнями файлов и ооочень мутной логикой. Надо его запустить под последним пыхом.

Проблема в том, что там постоянно используются short_open_tags (<? вместо <?php) и register_globals ($q вместо $_GET[«q»]). Короткие теги пока не выпилили, с ними в порядке. А register_globals всё.

В сумрачных застенках рожден вот такой кусок кода, который симулирует действие register_globals:

foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_SG) {
    foreach ($$_SG as $_SGK => $_SGV) {
        $$_SGK = $_SGV;
    }
}

Теперь нужно запускать этот кот передо всеми php-скриптами из этого сайта. Но как?

★★★★☆

Думаю, можно это как-то сделать средствами nginx.

CYB3R ★★★★★
()

Пройдись скриптом и допиши в каждый файл нужный сниппет. Или собери старый PHP и настрой его использование для старого сайта.

Black_Roland ★★★★
()

Можно php_value auto_prepend_file «/var/some/php.php» в .htaccess например

anonymous
()

foreach кстати можно заменить на extract($_REQUEST); extract($_SERVER);

anonymous
()

Теперь нужно запускать этот кот передо всеми php-скриптами из этого сайта. Но как?

лечи подобное подобным. Используй sed для правки всего этого говнокода, вставляя pragma_once(). Не нужно из-за одного говносайта ломать настройки всего сервера, ещё и таким уродским образом(если ты не знал, то это была дыра в php, которую наконец починили).

emulek
()

Здесь можно почитать. Если у вас апач, то можно вставить вот это в .htaccess:

php_value auto_prepend_file "/real/path/to/file/file_name.php"
Для nginx не знаю как это сделать. Если есть доступ к php.ini, то там прописать соответствующую переменную. Обратите внимание, что при использовании htaccess путь должен быть абсолютным, так как относительный будет отсчитываться от текущего для скрипта каталога. Что для подкаталогов не айс.

Weres ★★★
()
Ответ на: комментарий от stevejobs

#cat .htaccess

php_value auto_prepend_file "./../php/main.php"

anonymous
()
Ответ на: комментарий от stevejobs

Опоздал, уже ответили.

По поводу nginx: можно запускать FCGI-шные процессы с разными конфигами, должно быть в соотв. мануале.

Я в свое время делал два разных набора fcgi — один для битрикса, другой — для всего остального.

anonymous
()
Ответ на: комментарий от Black_Roland

Или собери старый PHP и настрой его использование для старого сайта.

Тогда уже лучше поднять LXC-контейнер с виртуалкой со старым PHP.

...

Но, вообще, забавно. О том, что register_globals зло — писалось ещё лет 12..13 назад. Лет пять назад было заявлено, что он станет сперва depricated, а потом и совсем будет выпилен.

Но кто-то продолжает практиковать это до сих пор... :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

наверное, людям нравится минимализм. $_GET[ тупо писать сложнее. Точно так же как <?php вместо просто <?

Зачем эти сложности ввели, кстати?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs
<?php
// $debug = true;
if ($debug) {
    echo "query: $query\n";
}

Чтобы у пхп-мартышек было меньше возможностей выстрелить себе в ногу.

PolarFox ★★★★★
()
Ответ на: комментарий от stevejobs

Зачем эти сложности ввели, кстати?

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

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

Это просто пример. Вместо debug могла быть любая другая случайно неиспользованная переменная, которую пхп услужливо приводит к 0 и false. И что мешает через post/get передать переменную с именем !debug?

PolarFox ★★★★★
()

This directive also affected the shorthand <?= before PHP 5.4.0, which is identical to <? echo. Use of this shortcut required short_open_tag to be on. Since PHP 5.4.0, <?= is always available.

Насчет short_open_tags не переживай, никуда они не денутся, они в новой пыхе по умолчанию работают.

gwinn ★★★★
()
Ответ на: комментарий от PolarFox

И что мешает через post/get передать переменную с именем !debug?

то, что называть переменные с восклицательного знака нельзя?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от KRoN73

ну, например, если есть какая-то админка для использования 3,5 человеками... н-р забивалка статей на сайт... почему бы не сделать ввод нефильтрованым?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Потому что тебе через эту админку рано или поздно зальют веб шелл на сервер.

xtraeft ★★☆☆
()
Ответ на: комментарий от stevejobs

почему бы не сделать ввод нефильтрованым?

Вопрос был «зачем эти сложности ввели». А админка на 3.5 человека, всё же, не мейнстрим PHP :)

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

Точно так же как <?php вместо просто <?

А это, потому что «<?» — это не только PHP. Но, например, «<?xml»

KRoN73 ★★★★★
()
Ответ на: комментарий от PolarFox

т.е. посетитель мог небрежным запросом создать и присвоить значение произвольной глобальной переменной? УЖАСНАХ!

MrClon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.