3

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


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

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

3 回答 3

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 仍然正确。

于 2009-09-28T15:55:46.590 回答
1

您可以使用以下命令检查 open_basedir 限制(如果已设置)的值

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

但是,如果您看到捷径,请随时对此进行改进。

于 2009-09-28T13:29:45.903 回答
0

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

于 2009-09-28T18:32:30.253 回答