【问题标题】:Check if open_basedir restriction is in effect检查 open_basedir 限制是否生效
【发布时间】:2014-02-21 00:39:44
【问题描述】:

我在使用 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 路径中?

【问题讨论】:

    标签: php open-basedir phpass


    【解决方案1】:

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

    ini_get('open_basedir')
    

    如果指令不为空,则应包含a string with one ore more paths,以PATH_SEPARATOR分隔。

    【讨论】:

    • 关于检查文件路径是否在允许范围内,您有什么建议?
    • 关于 open_basedir 值,引用自 PHP 文档:在 Windows 下,用分号分隔目录。在所有其他系统上,用冒号分隔目录。
    • @Linblow 只需使用PATH_SEPARATOR,您就不用担心了。
    • 我会用这个,但我希望有一个更简单的方法。这仍然需要相当多的代码来检查路径是否在那里。想象一个非常深的目录(例如,/a/b/c/d/e/f/g/),您还必须检查每个父目录...
    【解决方案2】:

    您可以使用is_readable 并使用@ 禁用此功能的警告。

    如果is_readable 返回 false,那么您就知道它不可读。

    $readable = @is_readable(..);
    if(!$readable) {
        ....not readable
    }
    

    【讨论】:

    • 可能与 OP 无关,但是:这将抑制“open_basedir 限制生效”以外的错误(例如没有读取权限、找不到文件等)
    • 哦,你确定吗?我认为@ 将禁用所有错误和警告
    • 这确实是我尝试的第一件事,但由于某种原因,警告仍然出现。
    • @MarcelBalzer 对,它抑制了所有错误。仅当您想知道错误是什么时才重要(以防它不是 open_basedir 错误)。只是想我会提到它以供考虑。 T.S.你到底是如何使用这个的?因为它应该起作用。
    • 在我的测试中,当 open_basedir() 有效时,@is_readable 仍然会抛出异常。
    【解决方案3】:

    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';
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2013-01-06
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      相关资源
      最近更新 更多