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

安全可靠地将文件路径转换为url

  •  2
  • navitronic  · 技术社区  · 17 年前

    我使用php,我有以下代码将绝对路径转换为url。

    function make_url($path, $secure = false){
        return (!$secure ? 'http://' : 'https://').str_replace($_SERVER['DOCUMENT_ROOT'], $_SERVER['HTTP_HOST'], $path);
    }
    

    我的问题基本上是,在安全性/可靠性方面,是否有更好的方法可以在位置和服务器之间进行移植?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Gumbo    17 年前

    这个 HTTP_HOST variable is not a reliable or secure value 因为它也是由客户端发送的。因此,在使用它之前,一定要验证它的值。

        2
  •  2
  •   Craig Francis    17 年前

    我认为安全性不会受到影响,仅仅因为这是一个url,正在打印到浏览器上。..最糟糕的情况是暴露文件的完整目录路径,并可能创建断开的链接。

    顺便说一句,如果这是在HTML文档中打印的,我假设您是通过类似htmlentities的方式传递输出。..以防输入$path包含类似[script]标签(XSS)的内容。

    不过,为了使这更可靠,我不建议在“DOCUMENT_ROOT”上进行匹配,因为有时它要么没有设置,要么不匹配(例如,当Apache重写规则开始妨碍时)。

    如果我要重写它,我只需确保始终打印“HTTP_HOST”即可。..

    function make_url($path, $secure = false){
        return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '', $path);
    }
    

    …如果可能的话,更新调用代码,使其只传递路径,这样我甚至不需要考虑删除“DOCUMENT_ROOT”(即如果路径与“DOCUMENT_ROOT”不匹配会发生什么)。..

    function make_url($path, $secure = false){
        return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$path;
    }
    

    这就留下了问题。为什么有这个功能?

    在我的网站上,我只是在脚本执行开始时定义了一个变量,它设置:

    $GLOBALS['webDomain'] = 'http://' . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
    $GLOBALS['webDomainSSL'] = $GLOBALS['webDomain'];
    

    我在哪里使用GLOBALS,这样它就可以在任何地方访问(例如在函数中)。..但如果你知道这个值不会改变,你可能还想考虑设置一个常量(定义)(我有时会在站点范围的配置文件中稍后更改这些值,例如,如果我有网站的HTTPS/SSL证书)。

        3
  •  0
  •   staticsan    17 年前

    我认为这是错误的做法。

    HTML中的URL支持相对位置。也就是说,你可以做到 <A href="filename.php">link</a> 指在其URL中与正确页面具有相同路径的页面。你也可以这样做 <a href="/dir/filename.php">link</a> 提供同一网站的完整路径。这两个技巧意味着你的网站代码不需要知道在哪里提供可用的网址。

    也就是说,你可能需要一些技巧,这样你就可以在 http://www.example.com/dev/site.php 另一个在 http://www.example.com/testing/site.php 。您需要一些代码来找出正在使用的目录前缀,但您可以使用配置值来实现这一点。我的意思是属于该(子)站点配置的值,而不是版本控制代码!

    推荐文章