Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

LOAD DATA LOCAL INFILE

8 réponses
Avatar
Edwin Vancleef
Bonjour, j'en ai marre :

The used command is not allowed with this MySQL version

Code :

mysql_connect( "localhost", "login", "pass", false, 128 ) or die(
"Perdu !\n" );
mysql_select_db( "base" );
mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" ) or
die( mysql_error() . "\n" );

Ce serveur MySQL autorise pourtant bien cette commande. La preuve :

mysql --local-infile=1 -h localhost -u login -p
use base;
LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`
Query OK, 5 rows affected (0.02 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0

Test à partir d'une autre machine :

- Code PHP identique
- Connexion au même serveur SQL, avec le même utilisateur, avec les
mêmes privilèges

Résultat : Ca marche.

Le seul truc différent entre les 2 machines : PHP4 contre PHP5, et
peut-être le php.ini. Pourtant, je n'ai rien vu de spécial : Safe Mode
SQL désactivé dans les 2 cas.

sql.safe_mode = Off

Question : Avez-vous une idée de ce mystère ?

8 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 03/06/2009 23:13, Edwin Vancleef a écrit :

[...]

Le seul truc différent entre les 2 machines : PHP4 contre PHP5, et
peut-être le php.ini. [...]



Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.

--
Olivier Miakinen
Avatar
Denis Beauregard
Le 03 Jun 2009 21:13:37 GMT, Edwin Vancleef
écrivait dans fr.comp.lang.php:

Bonjour, j'en ai marre :

mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" ) or



Chez moi, il faut enlever le "LOCAL" pour que cela marche.

Par ailleurs, pourquoi ne pas indiquer le chemin complet du fichier,
au cas où cela aurait une influence ?


Denis
Avatar
Edwin Vancleef
> Chez moi, il faut enlever le "LOCAL" pour que cela marche.



Oh... Ca marche chez moi aussi... Il me semble pourtant être déjà tombé
sur cette piste, mais je ne me souviens plus pourquoi je ne l'avais pas
suivie...

Merci, et excusez-moi d'avoir été aussi con...
Avatar
Edwin Vancleef
> Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.



J'ai déjà fouillé sur tout le réseau Internet du système solaire. Les
experts du SGBD qui connaissent MySQL sur le bout des doigts répondront
tous la même chose :

Pour que la commande LOAD DATA LOCAL INFILE fonctionne, il faut que le
serveur autorise la commande, mais il faut aussi que le client autorise
la commande (c'est dans la doc de MySQL).

Pour ce qui est du serveur, on sait qu'il l'autorise, puisque ça marche
pour le client mysql en ligne de commande. Il faut toutefois utiliser
l'option --local-infile=1 pour que le client autorise également la
commande.

En ce qui concerne PHP, pour autoriser la commande, il faut mettre le
flag 128. Ca marche sur mon PHP4. En ce qui concerne PHP5, il y a un
autre verrou magique qui m'échappe, qui bloque la commande, ou
peut-être, qui refuse le 128.

D'après la doc de PHP, le paramètre 128 est refusé en Safe Mode SQL. Or,
j'ai bien vérifié que le Safe Mode SQL était désactivé. D'ailleurs, j'ai
carrément désactivé tout le Safe Mode, et le serveur continue à
m'insulter :

The used command is not allowed with this MySQL version
Avatar
Edwin Vancleef
J'ai encore un problème :( LOAD DATA INFILE (sans LOCAL) me donne accès
à n'importe quel fichier du disque dur. C'est dangereux. J'en reviens
donc à vouloir faire marcher LOAD DATA LOCAL INFILE... :(
Avatar
Nico D\.
Edwin Vancleef a écrit :

mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" )



Le seul truc différent entre les 2 machines : PHP4 contre PHP5



Donc (à priori) Mysql 4 contre 5

J'ai déjà eu ce problème qui est lié à une différence de configuration
des droits -> voir dans la doc l'utilisation de LOCAL (de mémoire sur
une config standard Mysql5 il ne faut pas utiliser LOCAL).

--
Nico D.
Avatar
Denis Beauregard
Le 04 Jun 2009 13:52:40 GMT, Edwin Vancleef
écrivait dans fr.comp.lang.php:

J'ai encore un problème :( LOAD DATA INFILE (sans LOCAL) me donne accès
à n'importe quel fichier du disque dur. C'est dangereux. J'en reviens
donc à vouloir faire marcher LOAD DATA LOCAL INFILE... :(



Pourquoi ne pas valider le nom du fichier avant d'appeler cette
fonction ? Si un visiteur peut appeler directement la fonction sans
validation, alors il peut aussi l'appeler sans LOCAL...

Validation simple : il doit y avoir un seul point, ou bien il doit n'y
avoir aucune oblique ni contre-oblique.

Ceci dit, en phpmyadmin, on peut faire pratiquement ce qu'on veut de
toutes façons.


Denis
Avatar
Edwin Vancleef
> Pourquoi ne pas valider le nom du fichier avant d'appeler cette
fonction ?



Je ne peux pas. L'une des exigeances de mon programme est de permettre
au visiteur d'exécuter n'importe quelle requête SQL, sans aucune
limitation au niveau de la requête. C'est seulement au niveau des
privilèges que j'ai le droit de le limiter.

Si un visiteur peut appeler directement la fonction sans
validation, alors il peut aussi l'appeler sans LOCAL...



Non. Pour pouvoir utiliser la fonction sans LOCAL, il doit avoir le
privilège FILE, privilège que j'aurais parfaitement été disposé à lui
fournir si ça ne lui donnait pas accès à tous les fichiers.