Besoins de votre analyse

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Besoins de votre analyse

Re: Besoins de votre analyse

par AB » 02 juil. 2012, 05:13

J'ai insisté, parce qu'il faut avant tout avoir un code sécurisé avant d'explorer d'autres méthodes. :
Moi, je dirais bien qu'il faut avoir avant tout un code qui fonctionne. Pour les autres méthodes, on ne peut pas signaler à la fois que mysql de php est deprecated au profit de PDO ou mysqli et demander de sécuriser un code mysql.
Oui mais un code qui fonctionne sans être sécurisé c'est un piège. C'est le principe de sécurisation des données dans une requête que je mettais en avant ici. Une fois ce principe acquis on cherchera plus naturellement l'équivalent si on utilise d'autres extensions :wink:

Re: Besoins de votre analyse

par Azuriel » 01 juil. 2012, 23:04

C'est encore moi :D je reviens vers vous, car j'ai un problème pour pas changer :(

Alors, voici ma page modifier_administrateur (uniquement le pseudo)
<?php
session_start(); 

include 'config.php'; // Variables de l'annuaire
include 'fonction.php'; // Fonctions de l'administration l'annuaire
include 'securite.php'; // Vérification de la session et vérification de l'id administrateur
verif_connect(); // Si l'administrateur n'est pas identifier on affiche une erreur
verif_administrateur(); // Si ce n'est pas le créateur on affiche une erreur


$id_administrateur = mysqli_real_escape_string($bdd,$_GET['id']);  // On recupere l'id de l'administrateur a modifier


// Pour la gestion du formulaire 
$message = null;  // Initialisation du message de réponse

if (isset($_POST['pseudo'])) // Si le formulaire est envoyé
{
    // On récupé les variables issues du formulaire et on teste l'existence des données post en vérifiant qu'elles existent, 
	// qu'elles ne sont pas vides et uniquement composées uniquement d'espaces.
    // (Ce dernier point est facultatif et l'on pourrait se passer d'utiliser la fonction trim())
    // En cas de succès, on applique notre fonction Verif_magicquotes pour (éventuellement) nettoyer la variable.
	
		$pseudo = (isset($_POST['pseudo']) && trim($_POST['pseudo']) != '')? Verif_magicquotes($_POST['pseudo']) : null;		

		// Préparation des données pour les requêtes à l'aide de la fonction mysql_real_escape_string
		$pseudo_administrateur = mysqli_real_escape_string($bdd,$pseudo);		
				
		if(isset($pseudo)) // Si les champs $pseudo et $mail ne sont pas vide on peut aller plus loin
		{
			// Avec cette requête on recupere les données de l'administrateur à modifier
			$requete_recup = "SELECT pseudo, mail FROM ".$admin." WHERE ID = ".$id_administrateur."";
     
			// Exécution de la requête
			$infos_administrateur = mysqli_query($bdd,$requete_recup) or exit(mysqli_error($bdd));
		
			// Création du tableau associatif du résultat
			$donnees_administrateur  = mysqli_fetch_assoc($infos_administrateur);
						
			// Si le pseudo du formulaire est différent de celui qui est dans la base de données
			if($pseudo_administrateur!=$donnees_administrateur['pseudo']) 
			{
				// Avec cette requête on regarde dans la base de données si le pseudo est unique
				$requete_pseudo = "SELECT count(*) as nb FROM ".$admin." WHERE pseudo = '".$pseudo_administrateur."'";
     
				// Exécution de la requête
				$pseudo_unique = mysqli_query($bdd,$requete_pseudo) or exit(mysqli_error($bdd));
		
				// Création du tableau associatif du résultat
				$unique  = mysqli_fetch_assoc($pseudo_unique);
				
				// Si le comptage indique zéro alors le pseudo est unique et on peut le changer
				if($unique['nb']==0) 
				{
					// Requête pour changer le pseudo de la table par celui du formulaire
					$requete_change_pseudo = "UPDATE ".$admin." SET pseudo = '".$pseudo_administrateur."' WHERE ID = ".$id_administrateur."";
					
					// Exécution de la requête
					$change_pseudo = mysqli_query($bdd,$requete_change_pseudo) or exit(mysqli_error($bdd));	

					// Le pseudo à été changé
					$message = '<h4 class="alert_success">Le pseudo de l\'administrateur a été mis à jour avec succès. </h4>';					
				}
				else // Sinon c'est que le pseudo existe déjà et on affiche une erreur
				{
					// Le pseudo est déjà utilisé
					$message = '<h4 class="alert_warning">Ce pseudo est déjà utilisé, changez-le.</h4>';
				}
			}									
		}
		else  // Au moins un des deux champs : "pseudo" ou "mail" n'a pas été rempli
		{   
			// On affiche une erreur
			$message = '<h4 class="alert_error">Les champs "Pseudo" et "Email" doivent être remplis.</h4>';
		}
}

// Avec cette requête on recupere les données de l'administrateur à modifier
	$requete_recup_admin = "SELECT pseudo, mail FROM ".$admin." WHERE ID = ".$id_administrateur."";
     
	// Exécution de la requête
	$infos_administrateur = mysqli_query($bdd,$requete_recup_admin) or exit(mysqli_error($bdd));
		
	// Création du tableau associatif du résultat
	$donnees_administrateur  = mysqli_fetch_assoc($infos_administrateur);
			
// On definie quelque valeurs comme le titre et le la page en cours
define("TITRE", "Modifier un administrateur");
define("ARIANE", "<a href=\"accueil.php\">Accueil administration</a> <div class=\"breadcrumb_divider\"></div> <a class=\"current\">". TITRE ."</a>");

// On affiche le haut de page (header.php)
include 'header.php';

// On inclue la collone de droite
include 'colonne.php';

?>

 
 <section id="main" class="column">
		
		<article class="module width_full">
			<header><h3>Modification d'un administrateur</h3></header>
				<?php if(isset($message)) echo $message ?>
				
				<form action="#" method="post">		
					<div class="module_content">
						<fieldset>
							<label for="pseudo">Pseudo :</label>
							<input type="text" name="pseudo" id="pseudo" value="<?php echo $donnees_administrateur['pseudo']; ?>">
						</fieldset>						
						<fieldset>
							<label for="mail">Email : </label>
							<input type="text" name="mail" id="mail" value="<?php echo $donnees_administrateur['mail']; ?>">
						</fieldset>						
						<div class="clear"></div>
					</div>
					
					<footer>
						<div class="submit_link">					
							<input type="submit" id="valider" value="Modifier l'administrateur" class="alt_btn">
							<input type="reset" value="Reset">
						</div>
					</footer>
				</form>				
		</article><!-- end of post new article -->
		
		<h4 class="alert_info">Pour changer son mot de passe l'administrateur doit utiliser le lien "Mot de pase perdu ?"</h4>
			
		<div class="spacer"></div>
	</section>

</body>

</html>
Le code fonctionne en partie : si je ne change pas les valeurs du formulaire rien ne ce passe comme prévu, je rentre un pseudo qui existe déjà il m'indique que le pseudo est déjà utilisé mais, pour l'UPDATE il m'affiche une page blanche et le pseudo ne change pas ? Franchement je ne sais pas ou est l'erreur #-o

Bonne soirée à vous :wink:

C'est bon trouver :mrgreen: j'ai fait une faute ici : (oublier ' )
"UPDATE ".$admin." SET pseudo = ".$pseudo_administrateur."

Re: Besoins de votre analyse

par sirakawa » 01 juil. 2012, 19:00

J'ai insisté, parce qu'il faut avant tout avoir un code sécurisé avant d'explorer d'autres méthodes. :
Moi, je dirais bien qu'il faut avoir avant tout un code qui fonctionne. Pour les autres méthodes, on ne peut pas signaler à la fois que mysql de php est deprecated au profit de PDO ou mysqli et demander de sécuriser un code mysql.

Re: Besoins de votre analyse

par Azuriel » 01 juil. 2012, 18:15

Alors dis moi un peu, toujours pas de traces de l'utilisation de la fonction "mysql_real_escape_string" dans ton dernier sujet ? #-o :evil:
C'est en cours :wink: pour l'instant je prends le temps de lire quelque article qui parle de mysqli pour être sûr de mon choix, je vais commencer à mettre en pratique tous les conseils reçu et poste ma nouvelle page sur le forum sans oublier la fonction "mysql_real_escape_string" :D

Re: Besoins de votre analyse

par AB » 01 juil. 2012, 17:44

Bonjour AB,
Je te remercie pour ces explications et je vais commencer, j'ai survolé quelque lien et je pense utiliser mysqli qui me paraît plus facile.
Bref je prends tes conseils et je pars les mettre à exécution :D

Bonne journée
J'ai insisté, parce qu'il faut avant tout avoir un code sécurisé avant d'explorer d'autres méthodes. Sur un nouveau sujet et avec plein de pistes à explorer on ne reconnait pas toujours rapidement les priorités. Alors dis moi un peu, toujours pas de traces de l'utilisation de la fonction "mysql_real_escape_string" dans ton dernier sujet ? #-o :evil:

Re: Besoins de votre analyse

par Azuriel » 01 juil. 2012, 16:52

Bonjour AB,
Je te remercie pour ces explications et je vais commencer, j'ai survolé quelque lien et je pense utiliser mysqli qui me paraît plus facile.
Bref je prends tes conseils et je pars les mettre à exécution :D

Bonne journée

Re: Besoins de votre analyse

par AB » 01 juil. 2012, 05:22

Y'a pas de liens spécifiques, c'est juste une façon d'organiser son code, de découper les fonctionnalités avec des fonctions indépendantes qui seront plus faciles à gérer pour la maintenance (après programmation initiale).
C'est surtout utile quand il y a beaucoup de code, sinon pour du code assez simple comme c'est le cas ici, ce travail supplémentaire n'est pas nécessairement payant dans le sens où le coût (quantité) du travail que tu va passer à faire des fonctions indépendantes ne sert pas à grand chose puisqu'en l'état actuel le code est facile à comprendre et à gérer. C'est avec un peu d'expérience que tu comprendras l'intérêt de la chose mais tu peux essayer sur ton code pour te faire la main et cela te donnera aussi un aperçu de la programmation orientée objet dont un des grands principes est de découper les fonctionnalités en modules spécifiques.

Enfin bon comme dit initialement c'est juste une façon d'organiser son code. Cela ne préjuge pas de la qualité du fonctionnement du code, mais plutôt de la facilité de la maintenance (éventuelles évolutions etc.). Mais en premier pour ton code il faut ajouter impérativement mysql_real_escape_string sur les variables (pas les constantes ou les variables que tu définis en interne mais les variables externe : post, get, cookies) qui constituent tes requêtes sinon c'est une faille de sécurité énorme (et peu importe par ailleurs comment tu organise ton code).

Et puis tu as pu constater que l'extension mysql est dépréciée. Convertis d'abord ton code avec mysqli ou pdo (mysqli en mode procédural est plus facile pour profiter directement des exemples donnés avec mysql) pour être aux conforme aux nouvelles normes après t'être assuré que ton hébergeur accepte ces extensions. Si possible, autant partir sur de bonne bases :wink:

Ensuite si tu as du temps essaies d'optimiser l'organisation de ton code autrement en suivant par exemple les conseils de Mazarini. C'est un exercice intéressant (même si cela risque d'être assez peu convainquant pour ton exemple), mais ce que je veux dire c'est qu'avant de te payer ce "luxe" tu as pas mal de travail à faire pour avoir un code sécurisé et à jour (en évitant, si ton hébergeur le permet, l'extension mysql).

Re: Besoins de votre analyse

par Azuriel » 30 juin 2012, 20:25

Ok, vais essayer ça :wink:

Dit, tu n'aurais pas un lien avec de la doc sous la main ?
Je recherche avec google mais, pas trouvé :oops:

Re: Besoins de votre analyse

par Mazarini » 30 juin 2012, 19:21

Dans controle_saisie, tu fais tous les controles et dans traitement uniquement l'update.

Pour le message d'erreur, tu utilises une variable globale comme $message par exemple.

Re: Besoins de votre analyse

par Azuriel » 30 juin 2012, 18:42

Bonjour Mazarini,

Si j'ai bien tous compris ton code serai fonctionnelle tel quel ?
Et fonctionne comme ceci :
controle_acces(1);  // Si 1 c'est le créateur
if (controle_saisie()) { // On vérifie l'id
    traitement(); // Ici on regarde si l'id est 1 si ce n'est pas le cas : return false
}
 affichage(); // Sinon on affiche la page
C'est ça ou je n'ai pas compris ?
Et comment tu affiche l'erreur ? comme ceci :
traitement($erreur_niveau)
Merci de ta réponse et bonne fin de journée :wink:

Re: Besoins de votre analyse

par Mazarini » 30 juin 2012, 18:33

Bonjour,

Personnellement j'aurai fait des fonctions :
<?PHP
controle_acces(1);
if (controle_saisie()) {
   traitement();
}
affichage();
?>
controle_acces() est une fonction qui traite le controle de $_SESSION['id'] et affiche le message.
controle_saisie() regroupe les controles. Chaque erreur fait un return false et un return true à la fin
traitement() fait la mise à jour.
affichage() affiche la page.

J'y vois l'avantage de séparer les problèmes de programmation en fonction plus simple à mes yeux.

Re: Besoins de votre analyse

par Azuriel » 30 juin 2012, 18:03

Bonjour AB,
Je vais suivre ton conseil et mettre tous les fichiers sur le serveur, car comme tu dis si le fichier est indisponible ce n'est pas top.

Merci pour ce conseil, car franchement je ne m'étais jamais posé la question.

Re: Besoins de votre analyse

par AB » 30 juin 2012, 17:50

Effectivement vu sous cet angle c'est discutable, je vais m'arranger pour avoir directement tous les fichiers.
Merci pour cet avis sur ce point AB et bon appétit
Sage précaution :wink:
Je dis cela d'expérience car par exemple sur ce site j'utilise les services de "addthis" pour avoir une liste d'adresses mise à jour automatiquement vers les réseaux sociaux (en pied de page). Un jour leur serveur est tombé en panne et ce jour là, galère totale pour faire afficher le site alors qu'en plus ce code n'est pas indispensable pour le fonctionnement général.
Solution : pour avoir une liste mise à jour et un lien sûr, j'ai créé une tâche automatisée qui une fois par jour va chercher leur code sur leur serveur et si disponible, enregistre le contenu dans un fichier sur notre serveur :)

Re: Besoins de votre analyse

par Azuriel » 29 juin 2012, 19:16

Effectivement vu sous cet angle c'est discutable, je vais m'arranger pour avoir directement tous les fichiers.
Merci pour cet avis sur ce point AB et bon appétit

Re: Besoins de votre analyse

par AB » 29 juin 2012, 19:11

Le fait de mettre des lien js vers d'autres sites pour construire son site est très discutable.

De nombreux développeurs le font mais je ne trouve pas que cela soit une bonne idée. L'avantage évident est que le code appelé peut évoluer sans ton intervention mais c'est aussi potentiellement un pb : tu ne maîtrise pas le contenu et cela revient à faire une confiance aveugle à certains sites. En admettant que cela ne pose pas de pb, reste le pb que ces liens peuvent se trouver indisponibles (panne de serveur) et dans ce cas ta page va ramer grave (souvent plus de trente seconde) avant d'interrompre la tentative de chargement de ce lien temporairement rompu pour enfin afficher le reste de ton code.