open_basedir Einschränkung in Kraft. Datei (/) befindet sich nicht innerhalb der zulässigen Pfade:

86

Ich erhalte diesen Fehler bei einem Avatar-Upload auf meiner Website. Ich habe es noch nie zuvor bekommen und in letzter Zeit wurde nichts geändert, damit ich diesen Fehler bekomme ...

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):
Webnet
quelle
18
Sie haben eine nicht funktionierende Antwort akzeptiert.
Sjas

Antworten:

-21

Ändern Sie die open_basedirEinstellungen in Ihrer PHP-Konfiguration (siehe Laufzeitkonfiguration ).

Die open_basedirEinstellung wird hauptsächlich verwendet, um zu verhindern, dass PHP-Skripte für einen bestimmten Benutzer auf Dateien im Konto eines anderen Benutzers zugreifen. Normalerweise sollten alle Dateien in Ihrem eigenen Konto von Ihren eigenen Skripten gelesen werden können.

Beispieleinstellungen über, .htaccesswenn PHP als Apache-Modul auf einem Linux-System ausgeführt wird:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>
Nikesh
quelle
2
@Nikesh Dies gab mir einen Fehler von 500, nachdem ich ihn in meine .htaccces gelegt und die Pfade geändert hatte in : /my/cutsom/dir/. Ich weiß nicht warum.
Hitautodestruct
77
Cool, bisher 12 Upvotes für eine falsche Antwort. Sie können nicht php_admin_valuein .htaccessDateien verwenden . Sie können DirectoryMatch nicht in .htaccess-Dateien verwenden . (Was für eine Sicherheitsmaßnahme wäre open_basedir, wenn sie nur deaktiviert werden könnte?)
Álvaro González
1
@eoinoc - Scrolle nach unten und sehe zB Andrei's Antwort. Oder bearbeiten Sie die globale Datei php.ini.
Álvaro González
18
SIE SETZEN DIES NICHT IN IHREN HTACCESS! ABER EHER IN IHRE APACHE-KONFIG-DATEI.
tfont
7
Das Einfügen des Stammverzeichnisses in open_basedir macht den Zweck von open_basedir vollständig zunichte. Diese Lösung "funktioniert" nur in dem Sinne, dass sie die Einschränkung im Wesentlichen deaktiviert.
Martin
113

Ändern Sie die open_basedir-Einstellungen in Ihrem Hosting-Konto und setzen Sie sie auf none. Suchen Sie die Einstellung open_basedir im Bereich "PHP-Einstellungen" Ihres Plesk / cPanel. Setzen Sie es aus der dort angegebenen Dropdown-Liste auf "Keine". Ich habe sie im Plesk-Panel-Bild gezeigt.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Yogihosting
quelle
1
@yogihosting danach habe ich Fehler bekommen - Das angegebene Modell konnte nicht gefunden werden: Home_model
Heemanshu Bhalla
1
Etwas spät dran, aber gibt es eine Möglichkeit, dies für alle plesk-Sites zu tun? Ich habe es in der globalen php.ini für die Version, die die Websites verwenden, auf none gesetzt : gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Aber sie erhalten immer noch den Fehler.
Matt Cowley
@MattCowley Sie müssen dies für jede einzelne Site tun, die im plesk-Panel gehostet wird.
Yogihosting
1
Sehr hilfreiche Antwort, mein Problem gelöst Daumen hoch :)
Muhammadanish
1
Danke für diese Lösung! Dies funktioniert perfekt für mich auf Shared Hosting!
Smilefounder
38

Um diesen Fehler zu beheben, müssen Sie die Datei httpd.conf bearbeiten. Lange bevor es in phpinfo in der Apache2handler-Abschnittsanweisung Server Root zu sehen ist. Zum Beispiel in meinem Fall auf diese Weise - / etc / httpd / httpd.conf. Öffnen Sie die Datei httpd.conf und finden Sie die Erwähnung des Parameters open_basedir. Und setzen Sie es auf keine. ( php_admin_value open_basedir keine )

Andrei
quelle
Die Einstellung "Keine" hat bei mir funktioniert - auch über eine Plesk-Oberfläche.
Diggersworld
8
Ich habe die open_basedirKonfiguration in meinem gefunden php.ini. (Arch Linux auf Raspberry Pi mit PHP 5)
Dennisschagt
2
Fand es auch in meiner php.ini (auch Arch). Kommentieren Sie einfach die Zeile aus, um den gleichen Effekt wie bei dieser Antwort zu erzielen.
Ben Elgar
@ BenElgar nur durch das Kommentieren der Zeile hat Werke erwähnt, ich frage nur, ob es dort ein Risiko gibt
mwangaben
6

Wenn Sie dies mit ausführen php file.php. Sie müssen bearbeiten php.ini Suchen Sie diese Datei:

: locate php.ini
/etc/php/php.ini

Fügen Sie den Pfad der Datei zur open_basedirEigenschaft hinzu:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected

Deathangel908
quelle
Dies ist die einzige Lösung, die auf mehrere bestimmte Pfade verweist, anstatt nur die Sicherheit insgesamt zu überspringen.
mvreijn
5

Für mich war das Problem schlecht / fehlende Konfigurationswerte für den Plesk-Server, auf dem das Ganze ausgeführt wird. Ich habe gerade die Anweisungen hier befolgt: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

Sie können PHP so konfigurieren, dass für jede VirtualHost-Definition eine separate Fehlerprotokolldatei vorhanden ist. Der Trick besteht darin, genau zu wissen, wie es eingerichtet wird, da Sie die Konfiguration nicht direkt berühren können, ohne Plesk zu beschädigen. Jeder Domainname auf Ihrem (dv) hat ein eigenes Verzeichnis in / var / www / vhosts. Ein typisches Verzeichnis hat die folgenden Verzeichnisse der obersten Ebene:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

Sie möchten eine vhost.conf-Datei im Ordner conf / des Domänenverzeichnisses mit den folgenden Zeilen erstellen:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

Ändern Sie den ersten Wert entsprechend Ihrer tatsächlichen Installation (ich habe /tmp/phperrors.log verwendet). Nachdem Sie die Datei vhost.conf bearbeitet haben, testen Sie die Konfiguration über die Konsole mit:

apachectl configtest
or if you dont have apachectl (as Plesk 8.6 doesnt seem to)…

/etc/init.d/httpd configtest

Und schließlich sagen Sie Plesk, dass Sie diese Änderung vorgenommen haben.

/usr/local/psa/admin/bin/websrvmng -a
Josh P.
quelle
2

Der Pfad, auf den Sie verweisen, ist inkorrekt und nicht mit dem VerzeichnisRoot Ihres Arbeitsbereichs verknüpft. Versuchen Sie, einen absoluten Pfad für die Datei zu erstellen, auf die Sie zugreifen möchten, wobei Sie jetzt wahrscheinlich einen relativen Pfad verwenden ...

NDM
quelle
Es benutzt einen absoluten Pfad. Es funktioniert für alle Benutzer außer diesem.
Webnet
2

Wenn Sie ein solches Problem mit ispconfig3 haben und einen solchen Fehler erhalten haben

open_basedir Einschränkung in Kraft. Die Datei (/ var / www / clients / client7 / web15) befindet sich nicht innerhalb der zulässigen Pfade: .........

Um dies zu lösen (in meinem Fall), setzen Sie PHP einfach auf der Website von ispconfig3 auf SuPHP

Hoffe es hilft jemandem :)

Qlimax
quelle
2

Ich hatte dieses Problem auf einer meiner WordPress-Sites nach dem Aktualisieren und / oder Verschieben :)

Checken Sie in der Datenbanktabelle 'wp_options' den 'upload_path' ein und bearbeiten Sie ihn ordnungsgemäß ...

Bartuzz
quelle
Auf welchen Wert haben Sie ihn gesetzt? /[...‹/public_html/wp-content/uploads?
Brett
0

Wenn Sie einen PHP-IIS-Stack ausführen und diesen Fehler haben, handelt es sich normalerweise um eine schnelle Korrektur der Berechtigungen.

Wenn Sie den Windows-Server selbst verwalten und Zugriff haben, versuchen Sie Folgendes:

Navigieren Sie zu dem Ordner, in den Sie beim Schreiben trauern, und klicken Sie mit der rechten Maustaste darauf> Eigenschaften öffnen> Sicherheit.

Sehen Sie, welche Benutzer Zugriff auf den Ordner haben, welche schreibgeschützt und welche voll sind. Haben Sie eine Gruppe, die das Schreiben blockiert?

Das Update ist spezifisch für Ihr IIS-Setup. Verwenden Sie die anonyme Authentifizierung mit einem bestimmten Benutzer-IUSR oder mit der Identität des Anwendungspools?

In jedem Fall werden Sie am Ende eine neue vollständige Schreibberechtigung für eine der IUSR-, IIS_IUSRS- oder Ihre Anwendungspoolidentität hinzufügen. Wie ich bereits sagte, hängt dies von Ihrem Setup ab und davon, wie Sie es tun möchten. Sie können das Google-Kaninchenloch in diesem Fall durchgehen (ein solcher Beitrag - IIS_IUSRS- und IUSR-Berechtigungen in IIS8 ). Für mich verwende ich anon mit meiner App-Pool-Identität, damit ich MACHINE_NAME\IIS_IUSRSbei jedem temporären oder Upload mit vollständigem Lesen / Schreiben davonkommen kann Ordner.

Ich muss nichts extra zu meiner open_basedir =in der php.ini hinzufügen.

RobDigital
quelle
0

Wenn Sie DirectAdmin verwenden , führen Sie zusätzlich zur Antwort von @ yogihosting die folgenden Schritte aus:

  1. Gehen Sie zur Anmeldeseite von DirectAdmin. Normalerweise ist sein Port 2222.
  2. Melden Sie sich als Administrator an. Der Benutzername ist adminstandardmäßig.
  3. Stellen Sie auf der rechten Seite unter "Zugriffsebene" sicher, dass Sie sich auf "Admin-Ebene" befinden. Wenn nicht, ändern Sie es.
  4. Klicken Sie im Abschnitt "Zusätzliche Funktionen" auf "Benutzerdefinierte HTTPD-Konfigurationen".
  5. Wählen Sie die Domain aus, die Sie ändern möchten.
  6. Geben Sie die Konfigurationen, die Sie ändern möchten, in den Textbereich oben auf der Seite ein. Sie sollten die vorhandene Konfigurationsdatei berücksichtigen und die darauf basierenden Werte ändern. Wenn Sie beispielsweise sehen, dass dies open_basedirin a festgelegt ist <Directory>, sollten Sie Ihre Änderung möglicherweise im zugehörigen <Directory>Tag umgeben:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
  7. Nachdem Sie die erforderlichen Änderungen vorgenommen haben, klicken Sie auf die Schaltfläche "Speichern".

  8. Sie sollten jetzt sehen, dass Ihre Änderungen in der Konfigurationsdatei gespeichert sind, wenn sie gültig waren.

Es gibt jedoch eine andere Möglichkeit, die Konfigurationsdatei zu bearbeiten:

Achtung : Seien Sie vorsichtig und führen Sie die folgenden Schritte auf eigenes Risiko aus, da sonst Fehler auftreten oder Ausfallzeiten auftreten können. Der empfohlene Weg ist der vorherige, da er verhindert, dass Sie die Konfigurationsdatei falsch ändern und Ihnen den Fehler anzeigen.

  1. Melden Sie sich als root bei Ihrem Server an.
  2. Gehe zu /usr/local/directadmin/data/users. Wechseln Sie von den aufgelisteten Benutzern zu einer, die sich auf die Domain bezieht, die Sie ändern möchten.
  3. Hier gibt es eine httpd.confDatei. Erstellen Sie ein Backup daraus:

    cp httpd.conf httpd.conf.back
  4. Bearbeiten Sie nun die Konfigurationsdatei mit dem Editor Ihrer Wahl. Zum Beispiel bearbeiten bestehende open_basedirzu none. Versuchen Sie nicht, Dinge zu entfernen, da sonst Ausfallzeiten auftreten können. Speichern Sie die Datei nach der Bearbeitung.

  5. Starten Sie den Apache-Webserver auf eine der folgenden Arten neu ( sudobei Bedarf verwenden):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
  6. Wenn bei Ihnen Fehler auftreten, ersetzen Sie die Hauptkonfigurationsdatei durch die gesicherte Datei und starten Sie den Webserver neu.

Auch hier ist die erste Lösung die bevorzugte, und Sie sollten die zweite Methode nicht beim ersten Mal ausprobieren. Wie in der Warnung erwähnt, besteht der Vorteil des ersten Weges darin, dass das Speichern Ihrer schlecht konfigurierten Inhalte verhindert wird.

Ich hoffe es hilft!

MAChitgarha
quelle
0

Ich verwende eine Apache vhost- Datei, um PHP mit anwendungsspezifischen INI-Optionen auf meinem Windows-Server auszuführen. Deshalb benutze ich die Option -d des Befehls php.

Ich setze das open_basedir für jede Anwendung als eine dieser Optionen.

Ich musste mehrere URLs als open_basedir festlegen, einschließlich eines UNC-Pfads , und die Syntax für diesen Fall war etwas schwer zu finden. Sie müssen die Pfade mit Semikolons trennen. Wenn Ihr erster Pfad mit einem Driveletter beginnt, müssen Sie die Liste möglicherweise auch mit einem Semikolon beginnen. Zumindest funktioniert das bei mir.

Beispiel:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/
Fanax
quelle
0

Bei Verwendung von ispconfig3:

Gehen Sie zum Abschnitt Website -> Optionen -> PHP open_basedir:

Geben Sie hier die Bildbeschreibung ein

  • In diesem Feld wurden zulässige Pfade beschrieben und jeder Pfad wird durch ":" getrennt.

/ var / www / clients / client2 / web3 / image: / var / www / clients / client2 / web3 / web: / var / www / ... und so weiter

  • Hier muss also der Pfad angegeben werden, auf den Sie Zugriff haben möchten. In meinem Fall ist dies:

/ var / www / clients / client2 / web3 / image:

  • Das Problem tritt auf, weil:

Wenn ein Skript versucht, auf das Dateisystem zuzugreifen, z. B. mit include oder fopen (), wird der Speicherort der Datei überprüft. Wenn sich die Datei außerhalb des angegebenen Verzeichnisbaums befindet, verweigert PHP den Zugriff darauf.

Pavel Kenarov
quelle
-3

Einfach suchen

open_basedir =

in php.ini und deaktiviere es. Das ist die einfachste Lösung, um dieses Problem zu lösen.

Vor Änderungen open_basedir =

Nach Änderungen ;open_basedir =

Ps - Vergessen Sie nach Änderungen nicht, Ihren Server neu zu starten.

Genießen ;)

Lalit Giriya
quelle
3
Tu das nicht ... Sicherheit ist, ob du es glaubst oder nicht, wichtig. :) Zeit, Dokumente auf Ihren Tools zu lesen: php.net/manual/en/ini.core.php#ini.open-basedir
Adam Lenda