Как определить запрашиваемую страницу в PHP
Есть ли простой способ идентифицировать файл, первоначально обрабатывающий запрос, игнорируя аргументы и обрабатывая (по крайней мере, базовые) сопоставления, такие как /
to /index.php
?
В идеале, что-то вроде $_SERVER['REQUEST_URI']
, за исключением того, что оно возвращает одно и то же значение независимо от аргументов get, и это значение является запрошенным файлом, а не URI или исполняемым файлом ($_SERVER['PHP_SELF']
)., Другими словами, a $_SERVER['REQUESTED_FILE']
или что-то еще. Я не видел ничего подобного. Существует ли это, или мне нужно написать что-то вручную?
Обновление
Вот несколько примеров URL-адресов в сочетании с тем, что я хотел бы получить:
example.com/mypage.php : /mypage.php
example.com/ : /index.php
example.com/foo/?hello=world : /foo/index.php
И эти возвращаемые значения верны даже во включенных файлах. См. Мой ответ ниже, прежде чем отвечать, я думаю, что нашел то, что искал.
Ответы
Ответ 1
Я решил проверить это сам. Переменная $_SERVER['SCRIPT_NAME']
обслуживает путь к запрашиваемому файлу, даже если это индексный файл, и без параметров или чего-либо еще. В документации по PHP указано, что это путь к файлу, но он, по-видимому, относится к корню документа, как и к PHP_SELF
, но без уязвимости безопасности.
Вот код, который я использовал для тестирования: https://gist.github.com/dimo414/5484870
Выход при запросе example.com/?foo=bar
:
__FILE__: /var/www/index.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
И вывод при запросе example.com/index.php/<strong>XSS</strong>
:
__FILE__: /var/www/index.php
PHP_SELF: /index.php/XSS # note the XSS exploit (this is bold in browser)
SCRIPT_NAME: /index.php # No exploit here
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php/XSS
SCRIPT_NAME: /index.php
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
Как вы можете видеть, $_SERVER['SCRIPT_NAME']
всегда возвращает файл, который первоначально обрабатывал запрос, т.е. файл в URL, без каких-либо рисков XSS.
Ответ 2
$_SERVER['PHP_SELF']
Должен вернуть фактический script. Но есть различные методы.
У меня была лучшая ссылка на матрицу всех переменных среды, связанных с файлами, но я не могу ее найти. Я отредактирую, если он появится.
Изменить: я нашел хороший поток SO, который описывает различия между ними.
Ответ 3
Go получите имя файла из запрошенного URL-адреса, используя следующий код.
basename($_SERVER['URL']);
basename($_SERVER['REQUEST_URI']);
basename($_SERVER['SCRIPT_NAME']);
basename($_SERVER['SCRIPT_FILENAME']);
basename($_SERVER['REQUEST_URI']);
basename($_SERVER['PATH_TRANSLATED']);
basename($_SERVER['PHP_SELF']);
используйте любой из всех всех вложенных условий if, чтобы вы не пропустили имя файла каким-либо образом.
Ответ 4
Ответ 5
Его очень старый вопрос и не очень ясный.
Я понял, что вы хотите знать, какая страница отправляет запрос GET/POST. Это можно реализовать:
$_ SERVER ['HTTP_REFERER']
Теперь, чтобы получить фактическое имя страницы, напишите как:
= basename ($ _ SERVER ['HTTP_REFERER']);
Это поможет вам решить проблему.