获取PATH_INFO的便携且安全的方法

Lir*_*una 8 php pathinfo

我正在寻找一种便携式方式来接收(方便)$_SERVER['PATH_INFO']变量.

看了一会儿后,结果发现PATH_INFO是CGI/1.1,而且并不总是出现在所有配置中.

获得该变量的最佳方式(主要是安全方式)是什么 - 除了手动提取它(安全问题).

Ali*_*xel 11

好吧,我(几乎)确定不使用$_SERVER超全局密钥,提供另一种方法来解决这个问题PATH_INFO是不可能的,据说首先列出我们可能使用的所有$ _SERVER密钥:

  • 'PHP_SELF'
  • '请求参数'
  • 'SCRIPT_FILENAME'
  • 'PATH_TRANSLATED'
  • 'SCRIPT_NAME'
  • 'REQUEST_URI'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'

我们显然需要忽略最后两个.现在我们应该(我不知道这个事实,我只是假设,因为你这么说)过滤你提供的链接中存在的所有密钥(BTW离线ATM),这给我们留下了以下密钥:

  • 'PHP_SELF'
  • 'SCRIPT_FILENAME'
  • 'REQUEST_URI'

关于你对Anthonys的评论答案:

你现在只是变量变量. SCRIPT_FILENAME是CGI规范的一部分.如果PATH_INFO不可用,它将无法 使用.至于 REQUEST_URI,它是apache的mod_rewrite特定的. - LiraNuna

我正在使用PHP 5.3.0作为CGIcgi.fix_pathinfo = 1$_SERVER['REQUEST_URI']运行LightTPD/1.4.20-1(Win32),并且非常适合我,我还记得在没有人使用的时候使用相同的变量mod_rewrite所以我诚实的谦虚猜测是你在这一点上是完全错的.关于SCRIPT_FILENAME密钥,我无法测试那台ATM.尽管如此,如果我们非常努力地闭上眼睛并相信你是对的,那么我们只留下一个变量:

  • 'PHP_SELF'

我并不想在这里苛刻(我仍然相信有更多的解决方案)但是如果这PHP_SELF是你希望我们使用的唯一关键(假设没有PHP_SELF自己的拼版),那么只剩下一个解决方案:

function PATH_INFO()
{
 if (array_key_exists('PATH_INFO', $_SERVER) === true)
 {
  return $_SERVER['PATH_INFO'];
 }

 $whatToUse = basename(__FILE__); // see below

 return substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'], $whatToUse) + strlen($whatToUse));
}
Run Code Online (Sandbox Code Playgroud)

这个函数应该有效,但是使用常量可能会有一些问题,__FILE__因为它返回__FILE__声明常量的文件的路径,而不是所请求的PHP脚本的路径,所以这就是$ whatToUse的原因:你可以替换它'SCRIPT_FILENAME'或如果你真的相信你在说什么,只需使用'.php'.

您还应该阅读有关不使用原因的说明PHP_SELF.

如果这对你不起作用,我很抱歉,但我能想到其他任何事情.

编辑 - 为您提供更多阅读: