使用open_basedir可以解决PHP问题

时间:2009-09-28 13:06:18

标签: php include open-basedir safe-mode

我最近在部署应用程序时遇到错误。它在include路径中的路径上使用“is_readable”,但是受“open_basedir”限制。这给了我一个致命的错误。 在实际包含文件之前,我是否可以使用另一个函数来查看文件是否可包含?


编辑:这有效,但如何检测错误是因为包含失败还是因为包含文件中的某些错误?

try {
 include 'somefile.php';
 $included = true; 
} catch (Exception $e) {
 // Code to run if it didn't work out
 $included = false;
}

3 个答案:

答案 0 :(得分:2)

你可以'尝试'这个;)

<?php

function exceptions_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
set_error_handler('exceptions_error_handler');
try {
    include 'somefile.php';
    $included = true;
} catch (Exception $e) {
    // Code to run if it didn't work out
    $included = false;
}
echo 'File has ' . ($included ? '' : 'not ') . 'been included.';
?>

如果它不起作用,$ included将被设置为true,然后在catch中设置为false。如果它确实有效,那么$ included仍然是正确的。

答案 1 :(得分:1)

您可以使用

检查open_basedir rescriction(如果已设置)的值
ini_get( 'open_basedir' );

如果没有设置,它将返回允许的路径或空字符串。

编辑:

以open_basedir限制安全方式检查包含路径可能是这样的:

if ( strlen( ini_get( 'open_basedir' ) ) > 0 )
{
    $includeFile = 'yourInclude.php';
    $includePath = dirname( realpath( $includeFile ) );

    $baseDirs = explode( PATH_SEPARATOR, ini_get( 'open_basedir' ) );
    foreach ( $baseDirs as $dir )
    {
        if ( strstr( $includePath, $dir ) && is_readable( $includeFile ) )
        {
            include $includeFile;
        }
    }
}

但如果你看到一条捷径,可以随意改进。

答案 2 :(得分:0)

您可以尝试使用stat来实现与is_readable相同的效果,当我设置基本目录时,我听到它非常错误。