代码之家  ›  专栏  ›  技术社区  ›  LiraNuna

获取路径信息的便携安全方式

  •  8
  • LiraNuna  · 技术社区  · 15 年前

    我在找一份工作 接收信息的方式(方便) $_SERVER['PATH_INFO'] 变量

    PATH_INFO 源于CGI/1.1,my并非总是出现在所有配置中。

    获取该变量的最佳(主要是安全性方面的)方法是什么- 除了手动提取外

    6 回复  |  直到 13 年前
        1
  •  11
  •   Community CDub    7 年前

    嗯,我(几乎)肯定,如果不利用 $_SERVER PATH_INFO 尽管如此,这是不可能的 lets first list all of the $_SERVER keys 可能地 使用:

    • “查询字符串”
    • “路径_已翻译”
    • “脚本名称”
    • “请求URI”
    • “原始路径信息”

    我不知道这是事实,我只是假设,因为你这么说 )筛选您提供的链接中存在的所有密钥( which BTW is offline ATM

    • “PHP_SELF”
    • “脚本文件名”
    • “请求URI”

    关于您对 Anthonys answer

    您现在只是在处理变量。 SCRIPT_FILENAME 是CGI的一部分 REQUEST_URI ,这是apache的mod_重写 具体的里拉努纳

    我在跑步 cgi.fix_pathinfo = 1 $_SERVER['REQUEST_URI'] 对我来说很方便 mod_rewrite 我诚实而谦虚的猜测是你在这一点上完全错了 . 关于 脚本文件名

    • “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));
    }
    

    此功能应该可以工作,但是使用时可能会出现一些问题 __FILE__ 常量,因为它返回 __文件__ ,这就是为什么$whatToUse在那里:sou you can 换成 'SCRIPT_FILENAME' '.php' .

    你也应该 read this regarding why not to use PHP_SELF

    如果这对你不起作用,我很抱歉,但我可以想出其他的办法。

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

        2
  •  2
  •   Sahib J. Leo    13 年前

    $path_info = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['PHP_SELF']);
    

    例如,访问URL,如: http://somehost.com/index.php/some/path/here ,价值 $path_info "/some/path/here"

    它在windows和linux上运行的各种apache服务器中对我有效,但我不能100%确定它是否“安全”和“可移植”,很显然,我没有在“所有”服务器配置中测试它,但似乎可以工作。。。

        3
  •  1
  •   oops    15 年前
    function getPathInfo() {
        if (isset($_SERVER['PATH_INFO'])) {
            return $_SERVER['PATH_INFO'];
        }  
        $scriptname = preg_quote($_SERVER["SCRIPT_NAME"], '/');
        $pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
        return $pathinfo;
    }
    

    编辑:不带脚本\u名称,假设您有文档\u根目录(或可以自己定义/发现),并假设您有脚本\u文件名,则:

    function getPathInfo() {
        if (isset($_SERVER['PATH_INFO'])) {
            return $_SERVER['PATH_INFO'];
        }  
        $docroot = preg_quote($_SERVER["DOCUMENT_ROOT"], "/");
        $scriptname = preg_replace("/^$docroot/", "", $_SERVER["SCRIPT_FILENAME"]);
        $scriptname = preg_quote($scriptname, "/");
        $pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
        return $pathinfo;
    }
    

    另外@Anthony(抱歉,没有足够的代表发表评论):使用str_replace()将匹配字符串中的任何位置。它不能保证工作,你只想在开始时匹配它。此外,只有在脚本位于根目录下时,您才可以使用仅返回1个斜杠(通过strrpos)来确定脚本\ u名称的方法,这就是为什么您最好将脚本\ u文件名与docroot进行区分的原因。

        4
  •  1
  •   J. Bruni    14 年前

    让我看看我是否明白:

    1) 您对CLI不感兴趣:

    2) 您希望在所有操作系统+HTTP服务器+PHP组合中包含路径信息:

    • HTTP服务器可以是Apache1、Apache2、NginX、Lighttpd等。
    • PHP可以是版本4、5、6或任何版本

    简言之: $\服务器取决于服务器 "... 因此,便携式解决方案无法在$\u服务器上中继(仅举一个例子:我们有一个教程,在kbeezie.com/view/PHP self-path NginX/)的NginX HTTP服务器上设置PHP/CGI$\u服务器变量

    作为字符串可用,可以通过应用正则表达式和其他PHP字符串函数安全地从中获取路径_信息(还可以将输入字符串验证为有效URI)。

    所以,只要我们有 ... 然后是的,我们有一个便携式和安全的方法来确定路径信息从它。


    现在,我们有两个明确且重点突出的实施问题:

    1. 如何从URL获取路径信息?

    如何获取URL?

    1) 利用您对每个HTTP server+OS+PHP版本组合的深入而全面的了解,检查并尝试从$服务器阵列获取URL的各种可能性(验证“PHP\u SELF”、“QUERY\u STRING”、“SCRIPT\u FILENAME”、“PATH\u TRANSLATED”、“SCRIPT\u NAME”、“REQUEST\u URI”、“PATH\u INFO”、“ORIG\u PATH\u INFO”、“HTTP\u HOST”,“文档根目录”或其他内容)

    如何从URL获取路径信息?

    This code linked here does this.

    这是我对这个问题的拙见和看法。

        5
  •  0
  •   Anthony    15 年前

    在发布之前,我没有看到评论或链接。根据上面引用的作为CGI派生变量的页面,下面是一些可能有效的方法:

    function getPathInfo() {
        if (isset($_SERVER['PATH_INFO'])) {
            return $_SERVER['PATH_INFO'];
        }  
    
        $script_filename = $_SERVER["SCRIPT_FILENAME"];
        $script_name_start = strrpos($script_filename, "/");
        $script_name = substr($script_filename, $script_name_start);
    
        //With the above you should have the plain file name of script without path        
    
        $script_uri = $_SERVER["REQUEST_URI"];
        $script_name_length = strlen($script_name);
        $path_start = $script_name_length + strpos($script_name, $script_uri);
    
        //You now have the position of where the script name ends in REQUEST_URI
    
        $pathinfo = substr($script_uri, $path_start);
        return $pathinfo;
    }
    
        6
  •  -1
  •   streetparade    15 年前

    你可以试试

    $_ENV['PATH_INFO']; or
    getenv('PATH_INFO']; 
    
    推荐文章