PHP mkdir: Problem mit Berechtigung verweigert

99

Ich versuche, ein Verzeichnis mit der PHP-Funktion mkdir zu erstellen, erhalte jedoch die folgende Fehlermeldung : Warning: mkdir() [function.mkdir]: Permission denied in .... Wie kann man das Problem lösen?

folos
quelle
2
Plattform / Webserver / Betriebssystem?
Salman A
1
Schauen Sie sich diese Frage an: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Ich hatte das gleiche Problem und die Antwort hier hat gerade mein Problem behoben. Wenn Sie unter Linux laufen, trifft die dortige Antwort zu SELinux möglicherweise auf Sie zu.
Lucas Madureira
Versuchen Sie dies, es funktioniert für mich stackoverflow.com/a/12656964/7516620 Geben Sie hier die Linkbeschreibung ein
Akshay Italiya

Antworten:

171

Ich weiß, dass dies ein alter Thread ist, aber er braucht eine bessere Antwort. Sie sollten die Berechtigungen nicht auf 777 setzen müssen, da dies ein Sicherheitsproblem darstellt, da es Lese- und Schreibzugriff auf die Welt ermöglicht. Möglicherweise verfügt Ihr Apache-Benutzer nicht über Lese- / Schreibberechtigungen für das Verzeichnis.

Hier ist, was Sie in Ubuntu tun

  1. Stellen Sie sicher, dass alle Dateien der Apache-Gruppe und dem Benutzer gehören. In Ubuntu ist es die WWW-Datengruppe und der Benutzer

    chown -R www-data:www-data /path/to/webserver/www

  2. Als nächstes konnten alle Mitglieder der WWW-Datengruppe Dateien lesen und schreiben

    chmod -R g+rw /path/to/webserver/www

Die PHP- mkdir()Funktion sollte jetzt funktionieren, ohne Fehler zurückzugeben

simpleengine
quelle
3
Gute Antwort! Hoffentlich wird dies im Laufe der Zeit ganz oben auf der Seite landen!
Sehr unregelmäßig
16
Das ist eine sehr schlechte Idee .
Big McLargeHuge
Apache benötigt die Erlaubnis, Dinge wie Cache und Protokolle zu schreiben ... es ist nur eine Frage der Feinabstimmung.
Manatax
@simpleengine Hallo, ich habe Ihre Antwort bemerkt. Ich habe das gleiche Problem mit einem Projekt, das ich in CodeIgnter erstellen und in Ubuntu 14.14 Lts entwickeln möchte. Können Sie mir bitte die Schritte näher erläutern, die ich ausführen muss? tun, um diesen Fehler zu beheben ??? Um Ihnen einige zusätzliche Informationen zu geben: Der absolute Pfad ist /opt/lampp/htdocs/www/my-app/public/uploads.. Grundsätzlich versuche ich, dass jeder angemeldete Benutzer Dateien in den Upload-Ordner hochlädt und auch Album-Ordner erstellt (dies wird mit PHP durchgeführt), um Fotos zu speichern ..
ltdev
4
Ich mag keine Benutzer, die immer wieder sagen, dass es unsicher ist, ohne die sichere Vorgehensweise zu zeigen.
Che-Azeh
37

Späte Antwort für Leute, die dies in Zukunft über Google finden. Ich bin auf das gleiche Problem gestoßen.

HINWEIS: Ich bin auf MAC OSX LION

Was passiert ist, dass Apache als Benutzer "_www" ausgeführt wird und keine Berechtigung zum Bearbeiten von Dateien hat. Sie werden feststellen, dass KEINE Dateisystemfunktionen über PHP funktionieren.

Wie repariert man:

Öffnen Sie ein Finder-Fenster und wählen Sie in der Menüleiste Gehe> Gehe zu Ordner> / private / etc / apache2

Öffnen Sie jetzt httpd.conf

finden:

User _www 
Group _www

Ändern Sie den Benutzernamen:

User <YOUR LOGIN USERNAME>

Starten Sie nun Apache neu, indem Sie dieses Formular-Terminal ausführen:

sudo apachectl -k restart

Wenn es immer noch nicht funktioniert, mache ich Folgendes, bevor ich das oben genannte getan habe. Könnte verwandt sein.

Öffnen Sie das Terminal und führen Sie die folgenden Befehle aus: (Beachten Sie, dass sich meine Webserver-Dateien unter / Library / WebServer / www befinden. Ändern Sie sie entsprechend dem Standort Ihrer Website.)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Chris Ingis
quelle
6
Diese Lösung funktioniert, ermöglicht es Apache jedoch, Ihr System zu zerstören, falls jemand es dazu bringt, schädlichen Code auszuführen (z. B. durch den Shellshock-Exploit). Eine Alternative wäre, Apache als ausgeführt zu lassen _wwwund eine Gruppe für Sie und Apache zu erstellen. Bilden Sie eine neue Gruppe, sagen Sie angerufen trusted, und setzen Sie sich und _wwwin sie. Machen Sie dann den Gruppeneigentümer aller Dateien in Ihrem Serverdokumentenverzeichnis als vertrauenswürdig. Führen Sie schließlich chmod g+rwxnur die Dateien aus, auf die Apache Zugriff benötigt, damit die trustedGruppe die Berechtigung zum Bearbeiten der Dateien hat.
Chris Middleton
3
Ich mische mich nur ein, um noch einmal zu betonen, dass diese Antwort eine schlechte Idee ist. Es gibt viele sehr gute Gründe, warum Apache-Prozesse ihrem eigenen Spezialbenutzer gehören.
Danyamachine
15

Setzen Sie die Berechtigungen nicht auf 777, wenn Sie mkdir in PHP verwenden

Nur-Link-Antworten gelten in StackOverflow nicht als bewährte Methode, aber die hier gegebenen Ratschläge sollten im Allgemeinen NICHT befolgt werden.

Ich möchte auf diese großartige Antwort auf eine ähnliche Frage zurückkommen . Ich zitiere:

Bitte hören Sie auf, die Verwendung von 777 vorzuschlagen. Sie machen Ihre Datei für alle beschreibbar, was bedeutet, dass Sie die gesamte Sicherheit verlieren, für die das Berechtigungssystem entwickelt wurde. Wenn Sie dies vorschlagen, denken Sie über die Konsequenzen nach, die dies für einen schlecht konfigurierten Webserver haben kann: Es würde unglaublich einfach werden, die Website durch Überschreiben der Dateien zu "hacken". Also nicht.

Verwelken
quelle
9

Befestigen Sie die Berechtigungen des Verzeichnisses versuchen Sie ein Verzeichnis erstellen in .

Erik
quelle
Ich habe gerade das Problem in der ursprünglichen Frage gelöst, indem ich die Dateiberechtigungen mit Filezilla rekursiv auf 755 geändert habe. Klicken Sie mit der rechten Maustaste auf den übergeordneten Ordner, vorausgesetzt, es handelt sich um einen allgemeinen Datei-Repository-Ordner, für den 755 Berechtigungen festgelegt werden können. Klicken Sie dann auf Dateiattribute -> Numerischer Wert -> 755 und aktivieren Sie "In Unterverzeichnisse wiederverwenden". Die Weitergabe durch die Unterverzeichnisse dauert einige Minuten, wenn Sie viele Dateien haben. Dann versuchen Sie es erneut.
TARKUS
7

Ich weiß, dass dieser Thread alt ist, aber vielleicht hilft das eines Tages jemandem.

Das Problem, warum PHP "Berechtigung verweigert" für mkdir () sagt - falscher URL-Pfad. Um das Problem zu beheben, müssen Sie lediglich den richtigen Pfad ermitteln. Ich habe es so gemacht:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>
Boris
quelle
1
Ist mir beim Übertragen auf einen neuen Host passiert (das hat mysqlnd lol). Ich habe vergessen, in den neuen vollständigen Pfad des Basisverzeichnisses zu wechseln. Es stellte sich heraus, dass es eigentlich kein Berechtigungsproblem war.
JSG
2

Sie benötigen die Dateisystemberechtigung, um das Verzeichnis zu erstellen.

Beispiel: In Ubuntu 10.04 läuft Apache (PHP) als Benutzer: www-data in Gruppe: www-data

Das heißt, der Benutzer www-data benötigt Zugriff, um das Verzeichnis zu erstellen.

Sie können dies selbst versuchen, indem Sie 'su www-data' verwenden, um der Benutzer von www-data zu werden.

Als schnelle Lösung können Sie Folgendes tun: sudo chmod 777 my_parent_dir

Jon Skarpeteig
quelle
14
chmod 0777wird Lese- und Schreibzugriff auf die Welt geben! Sie sollten so etwas nicht empfehlen. Allerdings ist der Rat mit der Benutzergruppe derzeit der beste hier :)
KingCrunch
1
Wenn die Welt Zugriff auf das Betriebssystem hat, sicher. Der bessere Weg wäre: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig
Oder lassen Sie die Berechtigungen in Ruhe und fügen Sie der Gruppe des übergeordneten Verzeichnisses WWW-Daten hinzu.
Marc B
0

Was Sie auch tun können, ist: / etc / sudoers

Fügen Sie dort die folgende Zeile hinzu, die diesem Benutzer die Berechtigung erteilt. Www-data ALL = (ALL: ALL) ALL Warum www-data? Dies liegt daran, dass Apache unter diesem Benutzernamen ausgeführt wird.

Falls Ihr Benutzer anders ist, versuchen Sie es mit dem Benutzernamen ALL = (ALL: ALL) ALL

Das hat bei mir funktioniert.

Maxwells
quelle
5
Bearbeiten Sie nicht sudoersdirekt, sondern melden Sie sich als root an und verwenden Sie den visudoBefehl te : Er überprüft alle Änderungen, um fehlerhafte Änderungen zu vermeiden. Dies kann zu Analysefehlern führen, wenn die sudoers-Datei geladen wird, wodurch Sie möglicherweise machtlos werden (wie bei keinen Rechten an) etwas ändern)
Elias Van Ootegem
So finden Sie den Benutzernamen. wie www-data? Ich benutze Nginx, aber nicht arbeiten
Robspin
1
@robspin versuchen Sie dies: ps aux | egrep '(nginx)'
maxwells
0

Da Sie auf einem Mac arbeiten, können Sie sich der Gruppe _www (Apache-Benutzergruppe) auf Ihrem Mac hinzufügen:

sudo dseditgroup -o edit -a $USER -t user _www

und fügen Sie _www user zur Radgruppe hinzu. Dies scheint das zu sein, was der Mac als Dateien erstellt:

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA
quelle
0

Ich habe dieses Problem gerade. Meine beste Lösung, die ich Ihnen derzeit geben kann (obwohl Sie keinen Ihrer Codes angegeben haben), wäre:

  1. Überprüfen Sie, wie Sie Ihren Zielordner benennen, z. B.: New_folder (manchmal kann dies zu Berechtigungsfehlern führen, da die meisten Hosts nicht zulassen, dass zur Laufzeit Namen mit Unterstrich, Bindestrich usw. erstellt werden). Es hat bei mir funktioniert.
  2. Wenn Sie den rekursiven Befehl zum Erstellen von Unterordnern verwendet haben, vergessen Sie nicht, 0755 (denken Sie daran, 0 am Anfang einzufügen) in den Befehl mkdir einzufügen, z.

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Das funktioniert jetzt auch bei mir.

Arungisyadi
quelle
3
777 ist ein Sicherheitsproblem
MaicolBen
Gerade bearbeitet, bis 0755
Arungisyadi
0

Wenn Sie LINUX verwenden, überprüfen wir zunächst den Benutzer von Apache, da dies in einigen Distributionen unterschiedlich sein kann:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

Angenommen, das Ergebnis ist "http". Führen Sie die folgenden Schritte aus. Denken Sie daran, path_to_folder in Ordnerpfad zu ändern:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel
quelle
0

Überprüfen Sie, ob es kein Problem mit umask ist

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}
ceph3us
quelle
0

Nachdem Sie den FTP-Server mit installiert sudo apt-get install vsftpdhaben, müssen Sie ihn konfigurieren. Um den Schreibzugriff zu aktivieren, müssen Sie die /etc/vsftpd.confDatei bearbeiten und das auskommentieren

#write_enable=YES

Zeile, so sollte es lesen

write_enable=YES

Speichern Sie die Datei und starten Sie vsftpdmit neu sudo service vsftpd restart.

Weitere Konfigurationsoptionen finden Sie in dieser Dokumentation oderman vsftpd.conf

meine Sonne
quelle
0

Dieser Fehler tritt auf, wenn Sie den falschen Pfad verwenden.

Zum Beispiel:

Ich verwende das Ubuntu-System und mein Projektordnername lautet "myproject".

Angenommen, ich habe das Verzeichnis myproject / public / report und möchte einen neuen Ordner mit dem Namen " orders" erstellen

Dann brauche ich einen ganzen Weg, auf dem mein Projekt existiert. Sie können den Pfad per PWD-Befehl abrufen

Mein Root-Pfad lautet also = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

Es wird für dich funktionieren !! Genießen !!

Umang Soni
quelle