Raketenwissenschaftler: Permission denied beim PHP/MySQL Load into Table

Beitrag lesen

Hallo Klaus!

Zu meiner Erinnerung noch mal die Fehlermeldung:

Import-Error: File '/var/lib/mysql-files/t_company_20191120125208.csv' not found (OS errno 13 - Permission denied)

Ok. Die Rechte sind zwar viel zu weitgegehend gesetzt - das dürfte ein ernstes Sicherheitsproblem sein - aber gerade nicht zu der Fehlermeldung führen.

Kommen wir zu einem der nächsten Punkte der Liste:

LOAD DATA INFILE '...'

hat noch eine weitere Geschmacksrichtung. Also

LOAD DATA INFILE '...'

lädt eine Datei vom Dateisystem des Servers, Und verlangt, dass der Benutzer das "File-Privileg" hat.

LOAD DATA LOCAL INFILE '...'

lädt eine Datei vom Dateisystem des Client, kopiert diese auf den Server. Verlangt NICHT, dass der Benutzer das "File-Privileg" hat.

Das "Geht, geht nicht" kann also auch daraus resultieren, dass 'LOCAL' mal gesetzt ist, mal nicht.

Wichtiges aus dem Handbuch:

"Non-LOCAL load operations read text files located on the server. For security reasons, such operations require that you have the FILE privilege. See Section 6.2.2, “Privileges Provided by MySQL”. Also, non-LOCAL load operations are subject to the secure_file_priv system variable setting. If the variable value is a nonempty directory name, the file to be loaded must be located in that directory. If the variable value is empty (which is insecure), the file need only be readable by the server.

Using LOCAL is a bit slower than letting the server access the files directly, because the file contents must be sent over the connection by the client to the server. On the other hand, you do not need the FILE privilege to load local files."

  • Mit LOCAL wird übrigens immer eine Kopie auf dem Server erzeugt, was dann problematisch wird, wenn diese sehr groß sind und der freie Platz nicht mehr ausreicht. df -h /tmp (aus dem Server) könnte hilfreich sein, dieses zu erkennen.

ToDo:

  • Zu prüfen ist also, wie (und bei welchem Host/IP!) die Anmeldung erfolgt und ob immer der selbe Benutzer von demselben Host angemeldet wird (Falls der Benutzer bei lokaler oder Netzwerkanmeldung unterschiedliche Rechte bezüglich des "File-Privileg" hat).
  • Zu prüfen ist also auch, ob mal LOAD DATA INFILE und alternierend LOAD DATA LOCAL INFILE benutzt wird.
  • Man irrt oft bezüglich der Einstellungen. Ein SHOW GLOBAL VARIABLES LIKE 'secure_file_priv' zeigt, was wirklich läuft. Vergleiche das mit dem Pfad. Steht da wirklich '/var/lib/mysql-files/'? (Und "Nein, das wäre nicht falsch, Oracle sieht das als Default-Wert durchaus so vor.")
  • Falls LOAD DATA LOCAL INFILE benutzt wird, wäre die Variable load_infile zu prüfen: SHOW GLOBAL VARIABLES LIKE 'local_infile' und entweder neu zu setzen (ist dynamisch) oder voreinzustellen.