Подтвердить что ты не робот

Как определить запрашиваемую страницу в 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

И эти возвращаемые значения верны даже во включенных файлах. См. Мой ответ ниже, прежде чем отвечать, я думаю, что нашел то, что искал.

4b9b3361

Ответ 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

  • parse_url($_SERVER['REQUEST_URI']), а затем pathinfo($path) чтобы получить запрошенное имя файла
  • $_SERVER['PHP_SELF'], чтобы получить реальное имя файла
  • $_SERVER['SCRIPT_NAME'], чтобы получить реальное имя файла

Ответ 5

Его очень старый вопрос и не очень ясный. Я понял, что вы хотите знать, какая страница отправляет запрос GET/POST. Это можно реализовать:

$_ SERVER ['HTTP_REFERER']

Теперь, чтобы получить фактическое имя страницы, напишите как: = basename ($ _ SERVER ['HTTP_REFERER']);

Это поможет вам решить проблему.