Есть ли простой способ идентифицировать файл, первоначально обрабатывающий запрос, игнорируя аргументы и управляющие (по крайней мере основные) сопоставления, такие как /
to /index.php
?
Идеально, что я ищу, это что-то вроде $_SERVER['REQUEST_URI']
, за исключением того, что оно возвращает одно и то же значение независимо от аргументов get, и это значение является запрошенным файлом, а не URI или исполняемым файлом ( $_SERVER['PHP_SELF']
). Другими словами, $_SERVER['REQUESTED_FILE']
или что-то в этом роде. Я не видел ничего подобного. Он существует, или мне нужно написать что-то вручную?
Обновление Вот некоторые примеры URL-адресов в паре с тем, что я хотел бы получить:
example.com/mypage.php : /mypage.php example.com/ : /index.php example.com/foo/?hello=world : /foo/index.php
И эти возвращаемые значения верны даже во включенных файлах. См. Мой ответ ниже, прежде чем отвечать, я думаю, что нашел то, что искал.
Я решил проверить это сам. Переменная $_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.
$_SERVER['PHP_SELF']
Должен вернуть фактический скрипт. Но существуют различные методы .
У меня была лучшая ссылка на матрицу из всех переменных среды, связанных с файлами, но я не могу ее найти. Я отредактирую, если он появится.
Изменить: я нашел хороший поток SO, который детализирует различия между ними .
parse_url($_SERVER['REQUEST_URI'])
а затем pathinfo($path)
чтобы получить запрашиваемое имя файла $_SERVER['PHP_SELF']
чтобы получить реальное имя файла $_SERVER['SCRIPT_NAME']
чтобы получить реальное имя файла Его очень старый вопрос и не очень ясный. Я понял, что вы хотите знать, какая страница отправляет запрос GET / POST. Это может быть реализовано путем:
$ _SERVER [ 'HTTP_REFERER']
Теперь, чтобы получить фактическое имя страницы, напишите как: = basename ($ _ SERVER ['HTTP_REFERER']);
Это решит вас.
Пойдите, чтобы получить имя файла из запрошенного 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, чтобы вы не пропустили имя файла каким-либо образом.