Mailinglisten-Archive |
Ulf Wendel wrote: > Bearbeite, wie es Kristian vor ein zwei Tagen ausführlich runtergebetet > hat, die MySQL Datenbank "mysql", die nach jeder MySQL Installation > existiert. Hier sind die Zugriffsrechte gespeichert. In seinem Fall hat der Datenbankserver vermutlich versucht, ein LOAD DATA INFILE auszuführen. Davon gibt es zwei Versionen: Die traditionelle Version von LOAD DATA INFILE arbeitet so, daß der Datenbankserver, also der mysqld, versucht, die Daten zu laden. Dazu müssen sich die Daten auf dem Rechner befinden, auf dem der Datenbankserver läuft und die Daten müssen für diesen Server lesbar sein. Außerdem muß der User, der dies versucht, file_priv-Rechte haben. file_priv-Rechte sind nicht auf eine Datenbank beschränkbar, sondern direkt einem Anwender zugeordnet. Daher werden sie in der "user"-Tabelle der Datenbank "mysql" eingetragen. Mit dem Kommando USE mysql; UPDATE user SET file_priv = "y" WHERE user = "..." AND host = "..."; kann man einer user-host-Kombination dieses Recht erteilen. Danach muß man diese Änderung der Zugriffsrechte mittels "mysqladmin reload" am Prompt dem Datenbankserver bekannt machen. Das ist auch in Abschnitt 6.5 der MySQL-Doku noch einmal diskutiert (http://localhost/doc/packages/mysql/html/manual_toc.html#Privileges_provided und http://localhost/doc/packages/mysql/html/manual.html#LOAD_DATA für Suse 6.1-Anwender). Inhaber von file_priv-Rechten können Dateien auf dem Server in eine Tabelle einlesen und sich dann anzeigen lassen. Zum Beispiel liest CREATE TABLE ichhackdich ( zeile varchar(255) ); LOAD DATA INFILE "/etc/passwd" INTO TABLE ichhackdich FIELDS TERMINATED BY "_(at)_"; Query OK, 50 rows affected (0.01 sec) Records: 50 Deleted: 0 Skipped: 0 Warnings: 0 die passwd-Datei in die Tabelle ichhackdich ein, wenn ein Benutzer file_priv hat. Aus Sicherheitsgründen weigert sich der Datenbankserver, Dateien einzulesen, die nicht readable by all sind: LOAD DATA INFILE "/etc/shadow" INTO TABLE ichhackdich FIELDS TERMINATED BY "_(at)_"; ERROR 1085: The file '/etc/shadow' must be in the database directory or be readable by all Die neue Version von LOAD DATA INFILE erlaubt auch einen Modus, in dem die Daten von dem Client/der Client-Bibliothek geladen werden und dann ganz normal wie ein Batch-INSERT auf den Server gepumpt werden. Hier werden keine besonderen Privilegien verwendet; das Kommand muß dann lauten LOAD DATA LOCAL INFILE und so weiter. Diese Syntax wird ab MySQL Version 3.22.6 unterstützt; sie ist insbesondere in dem MySQL von Suse 6.1 enthalten. Ich verwende kein Webfrontend für MySQL, daher weiß ich nicht, ob Dein Script LOAD DATA INFILE oder LOAD DATA LOCAL INFILE verwendet. Wenn es das erstere tut, erklärt dies die Fehlermeldungen, die Du bekommst und ist leicht zu ändern, indem Du a) entweder das benötigte Privileg erteilst (Sicherheitsabwägung) oder b) Dein Webfrontend so zu hacken, daß es stattdessen die LOCAL- Version von LOAD DATA INFILE verwendet. Kristian -- Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00 Using PHP3? See our web development library at http://phplib.shonline.de/ (GPL)
php::bar PHP Wiki - Listenarchive