2014-01-29 5 views
8

Ich erhalte die folgende Warnung bei Verwendung von PHPass (http://www.openwall.com/phpass/):Überprüfen Sie, ob open_basedir Beschränkung in Kraft ist

open_basedir restriction in effect. File(/dev/urandom) is not within the allowed path(s) 

Obwohl dies kein großes Problem ist (es wird auf etwas anderes zurückgreifen), I‘ Ich möchte diese Warnung nicht haben. Die PHP-Anwendung sollte auf verschiedenen Servern laufen, einige Benutzer können diesen Pfad ihren erlaubten open_basedir-Pfaden hinzufügen, andere haben keinen Zugriff auf diese Konfiguration.

Meine erste Schätzung war, die Lesbarkeit mit is_readable() zu überprüfen, jedoch bekomme ich immer noch die Warnung.

Die Frage: Wie überprüfe ich, ob ein bestimmter Pfad oder eine Datei den open_basedir Pfaden hinzugefügt wurde?

Antwort

3

Sie können den Wert von PHP-Direktiven mit der ini_get() function lesen:

ini_get('open_basedir') 

Wenn die Richtlinie nicht leer ist, sollte es a string with one ore more paths durch PATH_SEPARATOR getrennt enthalten.

+0

Was schlagen Sie vor, wenn Sie überprüfen, ob ein Dateipfad innerhalb der zulässigen liegt? –

+0

Über den Wert von open_basedir, Zitat aus PHP doc: Unter Windows, trennen Sie die Verzeichnisse mit einem Semikolon. Bei allen anderen Systemen trennen Sie die Verzeichnisse mit einem Doppelpunkt. – Linblow

+0

@Linblow verwenden Sie einfach 'PATH_SEPARATOR' und Sie haben keine Sorgen. –

1

Sie können is_readable verwenden und die Warnung für diese Funktion mit einer @ deaktivieren.

Wenn is_readable false zurückgibt, wissen Sie, dass es nicht lesbar ist.

+0

Für das OP spielt es keine Rolle, aber: Dies unterdrückt andere Fehler als "open_basedir restriction in effect" (z. B. nicht gelesen Rechte, nicht die Datei finden, etc.) –

+0

Oh bist du sicher? Ich dachte, dass alle Fehler und Warnungen von der @ –

+0

deaktiviert werden. Dies war in der Tat das erste, was ich ausprobiert habe, aber aus irgendeinem Grund tauchte die Warnung immer noch auf. –

0

file_exists gibt eine Warnung aus, wenn das Verzeichnis eingeschränkt ist. Lassen Sie uns es verwenden:

function isRestricted($path) 
{ 
    // Default error handler is required 
    set_error_handler(null); 

    // Clean last error info. You can do it using error_clean_last in PHP7. 
    @trigger_error('__clean_error_info'); 

    // Testing... 
    @file_exists($path); 

    // Restore previous error handler 
    restore_error_handler(); 

    // Return `true` if error has occured 
    return ($error = error_get_last()) && $error[ 'message' ] !== '__clean_error_info'; 
}