2009-06-11 2 views
17

Есть ли какой-либо простой способ идентифицировать файл, первоначально обрабатывающий запрос, игнорируя получение аргументов и обработку (по крайней мере основных) сопоставлений, таких как /, до /index.php?Как определить запрашиваемую страницу в PHP

В идеале, что-то вроде $_SERVER['REQUEST_URI'], за исключением того, что оно возвращает одно и то же значение независимо от аргументов get, и это значение является запрошенным файлом, а не URI, а также исполняемым файлом ($_SERVER['PHP_SELF']). Другими словами, $_SERVER['REQUESTED_FILE'] или что-то в этом роде. Я не видел ничего подобного. Он существует, или мне нужно написать что-то вручную?

Update Вот некоторые примеры URL, спаренный с тем, что я хотел бы, чтобы результат:

example.com/mypage.php  : /mypage.php 
example.com/     : /index.php 
example.com/foo/?hello=world : /foo/index.php 

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

+0

Можете ли вы обновить свой вопрос и добавить гипотетический пример того, что вы ищете? Неясно, интересуетесь ли вы запрашивающим URL (http://example.org) или файлом, который используется для обслуживания запроса (/var/www/.../index.php) – Shoan

ответ

23

Я решил проверить это сам. Переменная $_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.

+0

Стоит отметить, что если вы используете какой-то метод MVC или переднего контроллера, тогда «SCRIPT_NAME» вернет скрипт, который предоставил include, поэтому, если все проходит через пример index.php, это то, что вернется - в этом случае $ _SERVER ['REQUEST_URI'] кажется Покажи фокус. –

+2

@MatthewRiches отмечают, что 'REQUEST_URI' выполняет другую задачу, чем' SCRIPT_NAME' - первый - это URI, запрошенный пользователем, в том числе параметры GET, где 'SCRIPT_NAME' намеренно не так, как это путь на сервере. Если вы работаете в библиотеке MVC, вы должны просмотреть документацию библиотеки, чтобы лучше всего идентифицировать фактически запрошенный файл. – dimo414

6
$_SERVER['PHP_SELF'] 

Должен вернуть подлинный скрипт. Но есть various methods.

У меня была лучшая ссылка на матрицу всех переменных окружения, связанных с файлами, но я не могу ее найти. Я отредактирую, если он появится.

Редактировать: Я нашел a nice SO thread that details the differences between them.

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

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

$ _SERVER [ 'HTTP_REFERER']

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

Это решит проблему.

+0

Нет, вопрос ни в коем случае не спрашивает об HTTP-реферере. Это было бы (когда установлено) указать, на какой странице был ранее указан пользователь, который ссылался на эту страницу. Вопрос заключается в запросе запрашиваемого файла, и принятый ответ показывает, что это '$ _SERVER ['SCRIPT_NAME']'. – dimo414

0

Для получения имени файла с запрошенного 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']); 

использовать любой из всех вложенных условий, чтобы вы не пропустили имя файла каким-либо образом.

+0

Это не имеет никакого отношения к вопросу. – dimo414

Смежные вопросы