我最近在部署应用程序时遇到错误。它在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;
}
答案 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相同的效果,当我设置基本目录时,我听到它非常错误。