Open_basedir'dan ile PHP is_readable sorun

3 Cevap php

I've recently gotten an error when I deployed an application. It used "is_readable" on a path within the include path, but one that was restricted by "open_basedir". This gave me a fatal error. Is there another function that I could use to see if a file is includable, before actually including it?


Düzenleme: Bu çalışır, ancak başarısız ya da çünkü dahil dosyası içinde bazı hata içerir çünkü hata olsaydı nasıl bulurum?

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

3 Cevap

Bu ;) 'try' olabilir

<?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.';
?>

Bu işe yaramazsa, dahil $ yakalamak true ayarlamak ve sonra false olacaktır. O iş olsaydı, $ dahil sadık kalır.

(Ayarlıysa) kullanarak open_basedir rescriction değerini kontrol edebilirsiniz

ini_get( 'open_basedir' );

Bu izin yolu (ler) ya da set değilse boş bir dize döndürür.

Edit:

Bir open_basedir kısıtlama güvenli bir şekilde dahil yolunu kontrol etme böyle bir şey gidebiliriz:

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

Ama bir kısayol görürseniz bu geliştirmek için çekinmeyin.

Sen baz dir ayarlandığında çok adamcağız duydum ki gibi is_readable aynı etkiyi elde etmek için stat kullanılarak deneyebilirsiniz.