JustOxlamon
@JustOxlamon
.net core backend разработчик

Как найти «скрытые» include? РНР код обращается к переменной, но она нигде явно не задана?

Есть у нас древний проект на apache+php 5.4 (сам я никогда PHP не касался, мой стек исключительно .net). Перед НГ решили запустить еще пару серверов, чтобы было дублирование, и народ не отвлекал нас в новогодние праздники, если основной сервер умрет. Собрали тестовую машину на nginx+php7.4-fpm. Ну и конечно ничего не работает.

index.php

<? include('work.php'); ?>
<html>
	<head>
	</head>
	<frameset rows="50,*,20" frameborder="yes" border="1" framespacing="1">
		<frame src="/Frameset/viewHeader/" scrolling="NO" marginwidth="0" marginheight="0" name="top" frameborder="NO">
		<frame src="/Frameset/viewContent/" name="main" scrolling="AUTO" marginwidth="12" marginheight="12" frameborder="NO">
		<frame src="/Frameset/viewFooter/" name="footer" scrolling="NO" marginwidth="0" marginheight="0" name="bottom" frameborder="NO">
	</frameset>
	<noframes>
		<body bgcolor="#FFFFFF" text="#000000"></body>
	</noframes>
</html>

work.php

.....
session_name('s');
session_start();
.....
$ui=$_SESSION;
$ui['val42'] = 42;
..... тут дальше идут миллионы всяких присваиваний вида $ui[''''] =
..... затем тут же идут всякие хелперы и прочее
function num($a){
	return number_format($a/100, 2,'.',',');
}
....

И дальше, например /Frameset/viewFooter/index.php (тот самый что внутри frame)

<html>
	<head>
		<meta http-equiv="refresh" content="600">
		<link rel="stylesheet" href="/_stylesheets/main.css">
	</head>
<body>
	<?=num($ui['val42'])?>
</body>
</html>

Ну и это не работает, потому что внутри frame переменная $ui не определена, функция num тоже неизвестная. Что как бы правильно, даже исходя из моего опыта .net, ведь внутри frame отдельная страница - отдельный запрос. Но проблема в том, что на старом сервере все работает.
Поэтому вопрос: почему? Может были, какие-то настройки apache или самого PHP, или раньше (во времена 5.4) так можно было делать. И как нам не переписывая все под НГ. Хотелось бы запустить это древнее *сайт* с минимальными переделками.

Предварительные ответы:
- внутри viewFooter.php никаких видимых include нету (может есть какие-то include по умолчанию, но не знаю, где и как поглядеть)
- стаковерфлоу утверждает, что так не бывает - https://stackoverflow.com/questions/25425958/acces... - я с ним согласен, но у меня на руках рабочий проект
- может apache как-то группирует запросы, а nginx нет (ведь внутри viewFooter.php даже нету session_start и прочего, но обращение к $ui работает)
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
JustOxlamon
@JustOxlamon Автор вопроса
.net core backend разработчик
Итак для тех кто, так же как и я, не будет видеть "скрытых" include. Но будет думать, что они ДОЛЖНЫ быть по всей логике, ответ следующий: для сервера apache есть .htaccess (да еще и не один, а во многих папках) и там будут правила перенаправления запросов RewriteRule (или аналогичные, например, вот справка https://httpd.apache.org/docs/2.4/howto/htaccess.html). Именно эти правила и могут вам помочь. В моем случае срабатывало правило

RewriteRule ^(Frameset|Journal|Objects|Reports)/(viewFooter|viewHeader|Structure|Operation)/$ index.php?mode=$1&action=$2

которое перенаправляло запросы вида /frameset/viewFooter на адрес /index.php с параметрами, а уже там был нужный include.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы