PHP是OpenBaseDir的可读性问题

PHP是OpenBaseDir的可读性问题,php,include,open-basedir,safe-mode,Php,Include,Open Basedir,Safe Mode,我最近在部署应用程序时遇到了一个错误。它在include路径中的路径上使用了“is_readable”,但该路径受到“open_basedir”的限制。这给了我一个致命的错误。 在实际包含文件之前,我是否可以使用另一个函数来查看文件是否可包含 编辑:这是可行的,但是如何检测错误是因为包含失败还是由于包含文件中的某些错误 try { include 'somefile.php'; $included = true; } catch (Exception $e) { // Code to

我最近在部署应用程序时遇到了一个错误。它在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;
}

您可以使用

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

编辑:

以开放的\u basedir限制安全方式检查include路径可能会出现以下情况:

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;
        }
    }
}
但是,如果你看到了一条捷径,请随意改进。

你可以“尝试”这个;)


您可以尝试使用来实现与“易读”相同的效果,我听说在设置base dir时,这种效果非常糟糕。

是的,但这确实告诉我文件是否可包含,因为即使在basedir之外的文件中,您有时也可以这样做,对吗?basedir限制的工作方式(据我理解)每个basedir上面的所有文件至少都应该是可访问的,因此您需要检查您试图包含的文件是否在basedir中,一旦完成,您可以使用的文件在没有致命错误的情况下是可读的。我刚从办公室出来,如果你需要进一步的帮助,我可以稍后发布一个合适的示例。很好的尝试:p,但是错误的包含不会引发异常,而是典型错误。啊,是的。我曾经使用一个错误处理程序,将PHP错误抛出异常。函数异常错误处理程序($severity,$message,$filename,$lineno){抛出新的错误异常($message,0,$severity,$filename,$lineno)}设置错误处理程序($exceptions错误处理程序”);不知道这是否是个好主意。事实上,我使用的框架会抛出所有标准PHP错误作为例外。我的框架(这个问题适用于)也会这样做。我认为这个错误是不可捕获的,但当然,它是可捕获的。从PHP5.2开始,is_readable的错误行为已经被修复。对于较旧的版本,确实最好使用static。如果您的框架将所有内容都作为异常抛出(如您在下面所评论的),则可以进入错误处理程序函数并检查生成的错误的$severity是多少。或者在上面建立你自己的。您可以使用的自定义错误处理程序的数量没有限制。事实上,您甚至可以从ErrorException本身获取严重性,但这如何帮助我检测实际包含是否导致了错误?
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;
        }
    }
}
<?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.';
?>