如何在PHP中识别请求的页面

dim*_*414 17 php

有没有简单的方法来初步确定了文件的处理请求,忽略得到的参数和操作(至少基本)的映射,比如//index.php

理想情况下,我正在寻找的是类似的东西$_SERVER['REQUEST_URI'],除了它返回相同的值,无论get参数如何,该值是请求的文件,而不是URI,也不是当前正在执行的文件($_SERVER['PHP_SELF']).换句话说,一个$_SERVER['REQUESTED_FILE']或什么的.我没见过这样的东西.它是否存在,还是需要手动编写?

更新 以下是一些示例网址与我希望的结果配对:

example.com/mypage.php       : /mypage.php
example.com/                 : /index.php
example.com/foo/?hello=world : /foo/index.php
Run Code Online (Sandbox Code Playgroud)

即使在包含的文件中,这些返回值也是如此.在回答之前看到我的答案,我想我找到了我想要的东西.

dim*_*414 27

我决定自己测试一下.该$_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): /
Run Code Online (Sandbox Code Playgroud)

请求时的输出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
Run Code Online (Sandbox Code Playgroud)

如您所见,$_SERVER['SCRIPT_NAME']始终返回最初处理请求的文件,即URL中的文件,没有任何XSS风险.

  • @MatthewRiches注意到`REQUEST_URI`与`SCRIPT_NAME'的用途不同 - 前者是用户请求的URI,包括GET参数,其中`SCRIPT_NAME`故意不是,因为它是服务器上的路径.如果您在MVC库中工作,则应查看库的文档,以了解如何最好地识别实际请求的文件. (2认同)

Oli*_*Oli 6

$_SERVER['PHP_SELF']
Run Code Online (Sandbox Code Playgroud)

应该返回实际的脚本.但是有各种方法.

我有一个更好的链接到所有各种文件相关的环境变量的矩阵,但我找不到它.如果它出现我会编辑.

编辑:我发现了一个很好的SO线程,详细说明了它们之间的差异.