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

时间:2008-12-17 06:02:28

标签: php security url robustness

我正在使用php,我有以下代码将绝对路径转换为网址。

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

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

3 个答案:

答案 0 :(得分:2)

我认为安全性不会受到影响,仅仅是因为这是一个网址,被打印到浏览器......可能发生的最坏情况是将完整的目录路径暴露给文件,并可能造成破坏链接。

作为一个小小的注意事项,如果这是在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所以它可以在任何地方访问(例如在函数中)......但是如果你知道这个值不会改变(你有时会改变这些值)你可能也想考虑做一个常量(define)稍后在站点范围的配置文件中,例如,如果我有网站的HTTPS / SSL证书。)

答案 1 :(得分:2)

HTTP_HOST variable is not a reliable or secure value因为它也是由客户发送的。因此,请务必在使用前验证其值。

答案 2 :(得分:0)

我认为这是错误的方法。

HTML中的

URL支持相对位置。也就是说,您可以<A href="filename.php">link</a>引用其URL中与相关页面具有相同路径的页面。您也可以<a href="/dir/filename.php">link</a>提供同一网站的完整路径。这两个技巧意味着您的网站代码并不真正需要知道提供工作URL的位置。

也就是说,您可能需要一些技巧,因此您可以在http://www.example.com/dev/site.php上设置一个网站,在http://www.example.com/testing/site.php上设置另一个网站。您需要一些代码来确定正在使用哪个目录前缀,但您可以使用配置值来执行此操作。我指的是属于该(子)站点配置的值,而不是版本控制的代码!