检查是否启用了open_basedir限制

9
我在使用 PHPass (http://www.openwall.com/phpass/) 时收到以下警告:
open_basedir restriction in effect. File(/dev/urandom) is not within the allowed path(s)

尽管这不是一个大问题(它会退回到其他东西),但我希望不要出现此警告。PHP应用程序应该在不同的服务器上运行,一些用户将能够将该路径添加到其允许的open_basedir路径中,但其他用户将无法访问该配置。
我的第一个想法是通过is_readable()检查可读性,但是我仍然收到警告。
问题是:如何检查某个路径或文件是否已添加到open_basedir路径中?
3个回答

3

您可以使用ini_get()函数读取PHP指令的值:

ini_get('open_basedir')

如果指令不为空,它应该包含由PATH_SEPARATOR分隔的一个或多个路径字符串,参考此处

你认为如何检查文件路径是否在允许的范围内? - Wesley Murch
关于 open_basedir 值,引用 PHP 文档的说法:在 Windows 下,使用分号来分隔目录,在其他所有系统中,使用冒号来分隔目录。 - Linblow
@Linblow 只需使用 PATH_SEPARATOR,您就不必担心了。 - Wesley Murch
我会使用这个,但我希望有更简单的方法。这仍然需要相当多的代码来检查路径是否存在。想象一下一个非常深的目录(例如 /a/b/c/d/e/f/g/),你还必须检查每个父目录... - T.S.

1

file_exists函数在目录受限时会发出警告。让我们使用它:

function isRestricted($path)
{
    // Default error handler is required
    set_error_handler(null);

    // Clean last error info. You can do it using error_clean_last in PHP 7.
    @trigger_error('__clean_error_info');

    // Testing...
    @file_exists($path);

    // Restore previous error handler
    restore_error_handler();

    // Return `true` if error has occured
    return ($error = error_get_last()) && $error['message'] !== '__clean_error_info';
}

1
你可以使用is_readable,并使用@禁用此函数的警告。
如果is_readable返回false,则表示它不可读。
$readable = @is_readable(..);
if(!$readable) {
    ....not readable
}

可能对楼主无关紧要,但是这将抑制除“open_basedir限制生效”之外的其他错误(例如没有读取权限,找不到文件等)。 - Wesley Murch
哦,你确定吗?我以为通过@符号可以禁用所有的错误和警告。 - Maarkoize
这确实是我尝试的第一件事,但由于某种原因,警告仍然出现了。 - T.S.
@MarcelBalzer 对,它会抑制所有错误。只有在您想知道错误是什么(如果不是open_basedir错误)时才有影响。我只是想提一下供考虑。T.S. 您具体是如何使用它的?因为它应该可以工作。 - Wesley Murch
在我的测试中,当open_basedir()生效时,@is_readable仍会抛出异常。 - andig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接