phpbar.de logo

Mailinglisten-Archive

Re: [php] MySQL said: Access denied
Archiv Mailingliste php_(at)_infosoc.uni-koeln.de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [php] MySQL said: Access denied




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)

Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive