BACKUP MYSQL EN PHP

jdalton42 Messages postés 200 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 19 août 2009 - 25 sept. 2010 à 10:46
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011 - 5 oct. 2010 à 22:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52321-backup-mysql-en-php

masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
5 oct. 2010 à 22:12
hmmm...
On tourne un peut en rond ici ;)
Ce que je voulais dire ne s'applique pas uniquement à l'injection. En fait, lorsque je fait une requette, je protège systématiquement les données avec mysql_real_escape_string parceque sinon la requette peut planter. Pour illustrer, voici un exemple:
$clients_nom = 'Bouchard';
$clients_prenom = 'Gérard';
$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . $clients_nom . '\',\'' . $clients_prenom . '\')';
$db_resource = mysql_query($requette);

Pas de problème. Mais si on change les valeurs:
$clients_nom = 'l\'enruhmé'; //ne rigolez pas je connais qqu'un qui s'appelle comme ça
$clients_prenom = 'Gérard';

$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . $clients_nom . '\',\'' . $clients_prenom . '\')';
$db_resource = mysql_query($requette);

Là ça plante, donc il faut:
$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . mysql_real_escape_string($clients_nom) . '\',\'' . mysql_real_escape_string($clients_prenom) . '\')';
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
5 oct. 2010 à 14:55
D'ici peu , je mettrai le code a jour avec create table ,
cette fonction est si précise dans son résultat que je suis a peu près sur qu'elle nous vient de mysqldump

je doit ahjouter également en entête le charset de la table et l'inter classement ou collation ,
afin d'éviter les conflits possibles .
Pour l'écriture du backup , il n'y a bien sur aucun danger en cas d'injection sql enregistrée , c'est au moment de la restauration , ce sera la deuxième étape .
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
27 sept. 2010 à 20:56
+1 pour neigedhiver.
Pour protéger une requette mysql il faut utiliser mysql_real_escape_string($requette) sans quoi ça rique de coincer
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 sept. 2010 à 14:08
Des fois j'ai l'impression de ne pas être lu. Pourtant on me répond...

A ce que tu dis, je ne peux que répondre le contenu de mon message précédent...
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
27 sept. 2010 à 14:06
Dangereux , non , il s'agit simplement d'une fonction d'échappement devant des caractères spéciaux , les injections sql peuvent étre très complexes , quelquefois le signe - est utilisé , preg_quote s'en occupe .
Il s'agit ni plus ni moins d'une fonction sur une chaine de type string , opérationnelle sous php .
Quand au danger d'injections réinjectées , la oui , je ne suis pas sur de moi ,
faut voir .
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 sept. 2010 à 12:31
Je vois pas le rapport entre preg_quote et les données dans une bdd...
preg_quote sert à protéger une chaîne de caractères devant servir de masque pour une expression régulière compatible perl (PCRE). Cela signifie que les caractères spéciaux seront échapés (par spéciaux, j'entends ayant un sens pour une PCRE), ainsi que le caractère servant de délimiteur. C'EST TOUT !!
Les fonctions de protections des données fournies par les extensions relatives aux bases de données protègent elles, contre les valeurs dangereuses. Cela inclu des valeurs binaires qui ne sont pas du tout impactées par preg_quote.
Ce sont des fonctions qui ont des rôles différents : il convient donc de les utiliser pour ce à quoi elles sont destinées, il peut être dangereux de les détourner de leur utilisation première.
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
27 sept. 2010 à 12:16
Oups , excuse Alpha , je t'avait lu rapidement , mais c'est vrai que tu as raison .
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
27 sept. 2010 à 11:58
Bonjour Kim

Oui , je travaille avec winscp a partir de mon bureau , cryptage ssh , mysqldump .
Mais c'est vrai que les mutus n'ont pas ces fonctions , certains du moins .
Il faut avouer que c'est tentant de la jouer en php , si on dispose d'une fonction de cryptage , on peut crypter certaines tables comme celles de login .

Jour alpha , chacun a sa manière de coder , je ne discuterai pas ça , vu que c'est une question de gout .

Mais tu soulèves un problème intéressant , il y en a un autre et de taille ,
on risque de réinjecter une attaque sql si sur le site on a utilisé , par exemple les procédures préparées avec pdo ou mysqli , il faut prendre en compte cette possibilité , mysql_real_escape_string ne protège pas complètement des injections , donc , c'est un problème a résoudre , j'ai un début de réponse , employer preg_quote en complément .

Il est clair qu'il vaut mieux discuter concept que manière , pour le deuxième , on a tous des choix différents . Objet ou procédural , chacun ses gouts .
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 sept. 2010 à 09:40
C'est ce que je voulais dire : compresser fait "disparaitre" la problématique sans la résoudre réellement.
Je sais, je joue sur les mots et on se fout un peu de cette digression dans les commentaires de cette source...
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
27 sept. 2010 à 09:38
Oui Oui ... sauf que fait des essais d'export mysqldump et réimport sans compression, et tu verras que c'est pas gagné. Les caractères UTF-8 sont transformés en double caractères. La même chose avec un bon vieux bz2 et le problème est réglé. Je pense que le fond du problème vient de l'encodage natif du fichier txt en sortie de mysqldump. Quand les données sont intégrées dans le bz2, on n'a plus ce problème.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 sept. 2010 à 08:46
Je crois sincèrement qu'il n'y a vraiment aucun lien entre les accents et la compression du fichier SQL...
Vraiment... En fait, ce n'est absolument pas lié.
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
27 sept. 2010 à 07:35
Hello. Ok pour l'exercice. Au cas où un débutant tomberait sur cette source et souhaiterait lui aussi sauvegarder sa DB sans problème (d'accent par exemple), voila ma fonction en vrac, (sans la connexion à la DB) :

//--------------
private function sauvegarde_mysql(){
$date = date("Y_m_d");
switch($this->format){
case "bzip2":
$extension = ".sql.bz2";
break;
case "gzip":
$extension = ".sql.gz";
break;
default:
$this->erreur("Format de compression " . $this->format . " non pris en charge.");
break;
}
$fichier = $this->dossierSauv . $this->nomDb . "_" . $date . $extension;
exec('mysqldump --user="' . $this->utilisateur . '" --password="' . $this->motDePasse . '" "' . $this->nomDb . '" | ' . $this->format . ' > "' . $fichier . '"');
$this->response->setVar("message", "Sauvegarde effectuée. Fichier " . $fichier . " sauvegardé");
$this->response->setVar("dossierSauv ", $this->dossierSauv);
$this->response->setVar("nomDuFichier", $this->nomDb . "_" . $date . $extension);
}
//-------------

Le fait de gziper ou bziper la sauvegarde (suivant les dispos du serveur) permet de ne pas avoir de problèmes d'accents lors de la réimportation de la sauvegarde. A savoir que PHPMySQL permet une importation directe du .bz2 ou du .gz
cs_Kimjoa Messages postés 262 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 19 septembre 2014
26 sept. 2010 à 16:16
sinon il y a le jar mysqldump livré dans mysql qui est fait pour ca. Après je sais pas si on peux l'invoquer sur un serveur mutualisé...
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
26 sept. 2010 à 13:13
Sincèrement, les performances et la taille, sur un script d'administration, c'est vraiment pas une priorité...
Si ton script doit mettre 10 secondes pour s'exécuter alors que tu pourrais descendre à 7, on s'en cogne pas mal... Le seul utilisateur impacté, c'est l'admin qui fait son backup et qui SAIT que c'est long...
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
26 sept. 2010 à 12:31
Voila , j'ai trouvé la solution pour la fonction create table ,
c'est on ne peut plus simple ,
http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

je complèterai donc le script a la manière de mysqldump , if table exists
drop table puis create table .

Je me suis un peu compliqué la vie , j'ai voulu éviter les multiples instances "insert into" par une virgule , le gain est minime , je pense qu'il vaut mieux simplifier pour avoir un code plus sur et rapide , quitte a prendre des kilos .
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
25 sept. 2010 à 15:18
Salut,

Je ne suis pas convaincu par cette source... Bon, tu dis que c'est un excercice, alors soyons indulgent...

Il y a deux choses qui me gênent profondément :
- l'utilisation des fonction mysql_*
- la non sauvegarde de la structure...

Que veux-tu dire par "je n'ai pas trouvé le moyen d'émuler correctement la fonction create table" ?
Le terme "émuler" me semble inapproprié, du coup, je n'ai aucune idée de ce que tu veux réellement dire... Donc je ne peux rien proposer...
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
25 sept. 2010 à 13:16
En fait c'est un exercise , car j'ai eu beau essayer , je n'ai pas trouvé le moyen d'émuler correctement la fonction create table , j'ai deux versions , mais aucune n'as une syntaxe parfaite .

Mysqldump reste la solution la plus fiable , évidemment .
jdalton42 Messages postés 200 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 19 août 2009
25 sept. 2010 à 12:40
pas de problème ;)

j'ai pas encore testé le code mais très court, sa a l'air pas mal ;)
je testerai tout à l'heure
brouno Messages postés 8 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 16 septembre 2005
25 sept. 2010 à 11:54
Tu as raison , merci .
Je corrige .
jdalton42 Messages postés 200 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 19 août 2009
25 sept. 2010 à 10:46
alors, j'ai pas exécuté le code mais rien qu'en le regardant, déjà des erreurs:
à la ligne 5 : define('T',$nom_de_la_table); || $nom_de_la_table => $nom_de_la_base
à la ligne 13 : mysql_list_tables($nom_de_la_table); || $nom_de_la_table => $nom_de_la_base

je pense que c'est tout
Rejoignez-nous