Adaptation pour passage à php5

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 : Adaptation pour passage à php5

par Nagol » 18 juin 2009, 09:35

ahh, c'est une suggestion à faire à nos amis administrateurs, les invité devraient avoir résolu, sinon les viphp comme moi ils se font des topics et des topics avant de trouver le topic pour aider :)

par Pierre40 » 18 juin 2009, 09:32

Je n'ai pas accès au bouton "Mettre Résolu" (invité) donc si un modérateur passe par là...

Bravo à cet excellent forum. :)

par Nagol » 18 juin 2009, 02:00

n'oublies pas le résolu :)

par Pierre40 » 17 juin 2009, 21:12

Merci et encore merci. Tout fonctionne. :D :D

par Ryle » 07 juin 2009, 16:26

Alors, pour tes tests, c'est effectivement utiliser :
if ($_GET['action']=="add")
php ne connaissant pas la variable $action si la directive register_globals n'est pas activée, il faut lui spécifier où se trouve la variable en question (provient-elle de get, de post, de la session ou d'un cookie)

De même pour les fichiers, il faut utiliser $_FILES comme tu l'as fait, mais les infos que tu cherches sont en fait dans un sous tableau : $_FILES['userfile']['name']

Toutes les infos ici : http://fr3.php.net/manual/fr/features.f ... method.php

Nota : il faudra songer à renommer tes fichiers. En effet, l'extension ".php3" n'a plus de raison d'être, et le jour où le serveur ne sera pas configurer pour interpréter ces fichiers, ton site ne fonctionnera pas ;)

par Pierre40 » 07 juin 2009, 14:06

Un grand merci. J'ai bien fait la modification avec mysql_real_escape_string() pour protéger le contenu.
Les explications étaient très claires et j'ai bien compris l'intérêt et le fonctionnement d'un tel ajout. :-)
L'ajout, la modification et la suppression fonctionnent maintenant parfaitement.

Le dernier point qui ne semble plus fonctionner avec php5 reste l'ajout d'une pochette de cd.
Là encore ça fonctionne parfaitement avec php4 mais pas php5.
Je sélectionne un fichier, je fais envoyer mais rien ne se passe; C'est comme si je n'avais pas sélectionné de fichier.
<?php

	include("config.php") ;
	include("connect_sql.php") ;


	
	$destination= $_SERVER['DOCUMENT_ROOT'] . "cd/pochettes" ;
	// Taille maximale autorisée : 100 ko
	$taille=100*1024;
	
	
	if ($action=="add")
	
	{
		if (ereg(".jpg",$userfile_name)) 
	
		{
			if ($userfile_size!=0) {$taille_ko=$userfile_size/1024;} else {$taille_ko=0;}
			if ($userfile=="none") {$message="Vous n'avez pas sélectionné de fichier";}
			if ($userfile_size>$taille) 
				{
				if($taille!=0) 
					{
					$taille_max_ko=$taille/1024;
					}
				$message="Votre fichier est trop gros ($taille_max_ko ko max)";
				}
			if ($userfile!="none" && $userfile_size<$taille && $userfile_size!=0)
				{
			
				$nom_fic=$id_boot.".jpg" ;
				
				if (!copy($userfile, "$destination/$nom_fic"))
					{
						$message="Probleme de transfert";
						}
					else
					{
					$message="&nbsp; ---> Fichier $nom_fic enregistré";
					// requete d'ajout
				
					$query = "UPDATE bootlegs SET exists_img=\"1\" WHERE id_boot=$id_boot" ;
					echo $query ;
					$result = mysql_query($query) or die (" &nbsp; ---> Requete d'ajout image invalide");
					
					
					}
				}
			printf ("$message<br>taille=%.2f ko.</font>",$taille_ko);	
?>			<script language="JavaScript" type="text/JavaScript">
				
				window.setTimeout("window.close()", 500);
			</script>
<?php
		}
		else
		{
			echo "vous devez envoyer un fichier JPG..." ;
		}
	}
	
?>

<blockquote> 
   <form action="<?php echo "ajout_img.php3?action=add" ; ?>" method="post" enctype="multipart/form-data" name="form1">
          adresse du .JPG sur votre machine :<br>
                      
                      <input name="userfile" type="file" id="userfile5" size="20">
                      <input type= "hidden" value="<?php echo $id_boot ; ?>" name="id_boot">
          
                  <input type="submit" name="Submit" value="Envoyer">
                (merci d'attendre que le fichier soit 
                  uploade)
        </form>
</blockquote>
Pour reprendre le principe de la mise à jour déjà effectuée, j'ai testé en modifiant :
if ($action=="add")
par
if ($_GET['action']=="add")

if (ereg(".jpg",$userfile_name))
par
if (preg_match("/.jpg$/",$_FILES['userfile_name'])) 

(d'après ce que j'ai lu ereg est maintenant à éviter).
$nom_fic=$id_boot.".jpg" ;
par
$nom_fic=$_POST['id_boot'].".jpg" ;


et modifier la requète d'update avec
WHERE id_boot='".$_POST['id_boot']."'
Mais je dois passer à côté de quelque chose ou faire une erreur car après avoir cliqué sur Envoyer, j'ai "vous devez envoyer un fichier JPG..." relatif au
echo "vous devez envoyer un fichier JPG..." ; 
Ca signifie donc que d'entrée, j'ai un problème avec ma correction ? :
if ($_GET['action']=="add")

par Ryle » 30 mai 2009, 19:52

En fait, l'idée, c'est juste de contrôler les données qui sont envoyées par l'utilisateur avant de les utiliser. En gros, si un utilisateur malveillant renseigne dans l'url la variable 'suppr2' avec la valeur suppr2='' OR 1=1, ta requête de suppression devient : " DELETE FROM bootlegs WHERE id_boot='' OR 1=1 ", ce qui a pour effet de vider toute ta table...

Ainsi, pour éviter que ce genre de chose n'arrive, on préconise d'utiliser mysql_real_escape_string() qui va protéger la variable :
"DELETE FROM bootlegs WHERE id_boot=".mysql_real_escape_string($_GET['suppr2']);
du coup, si l'utilisateur bricole le paramètre dans l'url, celle ci-devient : " DELETE FROM bootlegs WHERE id_boot=\'\' OR 1=1 " et va générer une erreur (ce qui est mieux que de perdre ses données ;))

Si le paramètre magic_quotes est activé cela réduit un peu les risques, puisqu'il va ajouter un \ devant les apostrophes et guillemets, mais ça ne couvre pas tout... Après tout dépend du contexte, mais c'est une habitude qui peut être bonne à prendre :)

A part ça, j'ai plus rien à redire sur ton code :)

par Pierre40 » 30 mai 2009, 18:23

J'ai finalement trouvé l'erreur : ils manquaient les ' ' dans la requête update.
En revanche, je n'ai pas trop compris comment il était possible de protéger le contenu avec mysql_real_escape_string().

par Pierre40 » 30 mai 2009, 16:27

Tout d'abord, merci 1000 fois pour ta réponse rapide et ton aide. C'est vraiment sympa.
J'ai bien suivi (enfin j'espère) tes conseils et j'ai modifié le code.
Il est à nouveau possible d'ajouter un nouveau cd, d'en effacer un et lorsque je souhaite en modifier un, maintenant les valeurs sont affichées dans le formulaire.
Je n'ai plus un formulaire vide comme avant).
Seulement, un dernier problème subsiste, lors de la modification d'un cd, j'obtiens après validation, le message "Requete de modif invalide".
J'ai beau chercher et essayer de comparer avec d'autres exemples, je ne comprends pas où est l'erreur.

Voici le code corrigé :
<?php

	include("config.php") ;
	include("connect_sql.php") ;

	// faire effacement si besoin:
	if (isset($_GET['suppr2']))
	{
		// requete de suppression
		$query_suppr_boot="DELETE FROM bootlegs WHERE id_boot=".$_GET['suppr2']."" ;
		$result_suppr=mysql_query($query_suppr_boot) or die ("Requete de suppression invalide");
		if ($result_suppr) echo "<hr width=\"50%\"><i>Le bootleg n°$suppr2 a bien été supprimé</i><hr width=\"50%\">" ;
		unset($_GET['suppr']) ;
	}

	//récupérer toutes les années où y a un bootleg
	$query_years="SELECT DISTINCT annee FROM bootlegs ORDER BY annee DESC" ;
	$result=mysql_query($query_years) or die ("Requete savoir années invalide");
	while ($row=mysql_fetch_array($result))
	{
		echo "<b>$row[annee]</b><br>\n" ;
		$query="SELECT * FROM bootlegs WHERE annee='$row[annee]' order by MOIS" ;
		$result2=mysql_query($query);
		while ($row2=mysql_fetch_array($result2))
		{

			$mois=$row2[mois];
			echo "<b><font size=-1>&nbsp;&nbsp;&nbsp;</font></b>$row2[titre] (<a href=".$_SERVER['PHP_SELF']."?modif=$row2[id_boot]#ancre>modif.</a> / <a href=boot.php?idboot=$row2[id_boot]>aperçu</a> / <a href=".$_SERVER['PHP_SELF']."?suppr=$row2[id_boot]#ancre>suppr.</a>)<br>\n" ;
			if ($_GET['modif']==$row2['id_boot'])
			{
		  		 echo "<a name=\"ancre\"></a>";
				// on affiche le formulaire pour modifier _CE_ boot
				 echo "<hr>MODIFICATION DE $row2[titre]<br><br>\n" ;
				 echo "<form name=\"modifiage\" action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">" ;
				 echo "<input name=\"modif2\" type=\"hidden\" value=\"$row2[id_boot]\">";
				 include_once ("form.php") ;
				 echo "</form>" ;
				 echo "<br><hr><br>\n" ;
			}
			if ($_POST['modif2']==$row2['id_boot'])
			{
				
				$query_ajout_boot="UPDATE bootlegs SET titre=".$_POST['titre'].",lieu=".$_POST['lieu'].",ville=".$_POST['ville'].",pays=".$_POST['pays'].",jour=".$_POST['jour'].",mois=".$_POST['mois'].",annee=".$_POST['annee'].",qualite=".$_POST['qualite'].",musiciens=".$_POST['musiciens'].",cd1=".$_POST['playlist1'].",cd2=".$_POST['playlist2'].",infos=".$_POST['infos'].",img=".$_POST['img'].",is_new=".$_POST['is_new']." WHERE id_boot=".$_POST['modif2']."";
				$result_ajout=mysql_query($query_ajout_boot) or die ("Requete de modif invalide");
				if ($result_ajout) echo "<hr width=\"50%\"><i>Le bootleg $titre a bien été modifié</i><hr width=\"50%\">" ;
				unset($_POST['modif2']) ;
			}
			if (isset($_GET['suppr']) && $_GET['suppr']==$row2['id_boot'])
			{
		  		 echo "<a name=\"ancre\"></a>";
				echo "<hr width=\"40%\"><div align=center><a href=".$_SERVER['PHP_SELF']."?suppr2=$row2[id_boot]>CONFIRMER LA SUPPRESSION</a></div><hr width=\"40%\">";
			}

		}
	}

?>
<hr>
NOUVEAU BOOTLEG 
  ?..
<form name="infos" method="post" action="ajout.php">
  <?php include_once ("form.php") ; ?>
</form>
Encore une fois, merci.

par Ryle » 28 mai 2009, 16:37

Alors effectivement, si ton hébergeur a désactivé la fonction register_globals, il te faut explicitement spécifier l'origine des variables que tu n'as pas déclaré.

Ainsi, dès le début de ton script par exemple : "if (isset($suppr2))" retournera toujours faux, dans la mesure ou php n'a pas la moindre idée de ce que peut être la variable $suppr2. Il te faut donc préciser si cette variable provient de la session, d'un cookie, d'un formulaire envoyé via la méthode post, etc.
Ainsi, si cette variable provient de l'url ou d'un formulaire envoyé en get, c'est $_GET['suppr2'] qu'il te faut utiliser, et non pas $suppr2 :)

Tu vas rencontrer le même problème dans ta requête update où il ne faudra plus utiliser $lieu, $ville, ... mais $_POST['lieu'], $_POST['ville'], ... Je te recommande par ailleurs de sortir tes variables des chaines pour plus de lisibilité, et également, lorsque celles-ci sont renseignées par l'utilisateur, de protéger leur contenu (mysql_real_escape_string()).

Edit : quelques remarques en vrac ;)
- Une balise <a> se ferme avec une balise </a>, même cela peut être très joli d'aller de "a" à "z", html fonctionne pas comme ça ;)
echo "<a name=\"ancre\"></z>"; 
- La variable $HTTP_POST_VARS est dépréciée, de même que $PHP_SELF, il faut respectivement utiliser $_POST et $_SERVER['PHP_SELF']
- Utilise de préférence les balises php classique "<?php" plutôt que les short tags "<?". Ainsi quel que soit le serveur sur lequel ton script est déployé, tu seras sur qu'il fonctionne sans avoir à bidouiller le php.ini ;)
- Mets des guillemets ou des apostrophes autour de tes chaines... un nom d'index est une chaine : $row2["id_vcd"] et pas $row2[id_vcd] , sans quoi php va se demander où trouver la constante id_vcd, avant de supposer qu'il n'y en a peut être pas et que c'était en fait une chaine :)

Adaptation pour passage à php5

par Pierre40 » 28 mai 2009, 11:45

Bonjour,

je dispose d'un petit système en php qui me permet de gérer une collection de cd. Une page présente la liste de cds déjà saisis avec pour chacun d'entre eux, un lien qui renvoie vers une page contenant tous les détails renseignés.
Mon hébergeur est passé à php5 récemment et depuis je rencontre des problèmes.
Si la page de listage des cds et celle donnant les détails de chaque cd fontionnent parfaitement comme sous php4, la page qui me permet de saisir les cds, de les modifier ou de les effacer (admin.php) ne fonctionne plus.
Je n'ai aucun message d'erreur, ni page blanche. La page se recharge sans prendre en compte les valeurs du cd que je souhaite ajouter, modifier ou effacer. Seule l'url change avec comme c'était le cas sous php4, en identifiant l'id du cd en question. exemple : /admin.php?modif=158#ancre

Je suis débutant et malheureusement pas encore assez confirmé pour résoudre ce problème moi même.
J'ai consulté des dizaines de sites pour essayer d'y parvenir, sans succès.

Outre, le passage de php4 à php5, je pense que le problème vient du changement de register_globals de ON à OFF.
Merci à ceux qui voudront bien m'aider.
<?
$tab_months=array('01'=>'Janvier',
					'02'=>'Février',
					'03'=>'Mars',
					'04'=>'Avril',
					'05'=>'Mai',
					'06'=>'Juin',
					'07'=>'Juillet',
					'08'=>'Août',
					'09'=>'Septembre',
					'10'=>'Octobre',
					'11'=>'Novembre',
					'12'=>'Décembre');

?>


BOOTLEGS DEJA 
  SAISIS:

  <?

	include("config.php") ;
	include("connect_sql.php") ;

	// faire effacement si besoin:
	if (isset($suppr2))
	{
		// requete de suppression
		$query_suppr_boot="DELETE FROM bootlegs WHERE id_boot=$suppr2" ;
		$result_suppr=mysql_query($query_suppr_boot) or die ("Requete de suppression invalide");
		if ($result_suppr) echo "<hr width=\"50%\"><i>Le bootleg n°$suppr2 a bien été supprimé</i><hr width=\"50%\">" ;
		unset($suprr) ;
	}

	//récupérer toutes les années où y a un bootleg
	$query_years="SELECT DISTINCT annee FROM bootlegs ORDER BY annee DESC" ;
	$result=mysql_query($query_years) or die ("Requete savoir années invalide");
	while ($row=mysql_fetch_array($result))
	{
		echo "<b>$row[annee]</b><br>\n" ;
		$query="SELECT * FROM bootlegs WHERE annee='$row[annee]' order by MOIS" ;
		$result2=mysql_query($query);
		while ($row2=mysql_fetch_array($result2))
		{

			$mois=$row2[mois];
			echo "<b><font size=-1>&nbsp;&nbsp;&nbsp;</font></b>$row2[titre] (<a href=$PHP_SELF?modif=$row2[id_boot]#ancre>modif.</a> / <a href=boot.php?idboot=$row2[id_boot]>aperçu</a> / <a href=$PHP_SELF?suppr=$row2[id_boot]#ancre>suppr.</a>)<br>\n" ;
			if ($modif==$row2[id_boot])
			{
		  		 echo "<a name=\"ancre\"></z>";
				// on affiche le formulaire pour modifier _CE_ boot
				 echo "<hr>MODIFICATION DE $row2[titre]<br><br>\n" ;
				 echo "<form name=\"modifiage\" action=\"$PHP_SELF\" method=\"post\">" ;
				 echo "<input name=\"modif2\" type=\"hidden\" value=\"$row2[id_boot]\">";
				 include_once ("form.php") ;
				 echo "</form>" ;
				 echo "<br><hr><br>\n" ;
			}
			if ($HTTP_POST_VARS[modif2]==$row2[id_boot])
			{
				// requete d'update
				$query_ajout_boot="UPDATE bootlegs SET titre='$HTTP_POST_VARS[titre]',lieu='$lieu',ville='$ville',pays='$pays',jour='$jour',mois='$mois',annee='$annee',qualite='$qualite',musiciens='$musiciens',cd1='$playlist1',cd2='$playlist2',infos='$infos',img='$img',is_new='$is_new' where id_boot='$modif2'";
				$result_ajout=mysql_query($query_ajout_boot) or die ("Requete de modif invalide");
				if ($result_ajout) echo "<hr width=\"50%\"><i>Le bootleg $titre a bien été modifié</i><hr width=\"50%\">" ;
				unset($modif2) ;
			}
			if (isset($suppr) && $suppr==$row2[id_boot])
			{
		  		 echo "<a name=\"ancre\"></z>";
				echo "<hr width=\"40%\"><div align=center><a href=$PHP_SELF?suppr2=$row2[id_boot]>CONFIRMER LA SUPPRESSION</a></div><hr width=\"40%\">";
			}

		}
	}

?>

NOUVEAU BOOTLEG ?..
<form name="infos" method="post" action="ajout.php">
  <? include_once ("form.php") ; ?>
</form>

VCDs DEJA SAISIS:
  <?

	// faire effacement si besoin:
	if (isset($vcd_suppr2))
	{
		// requete de suppression
		$query_suppr_vcd="DELETE FROM vcd WHERE id_vcd=$vcd_suppr2" ;
		$result_suppr_vcd=mysql_query($query_suppr_vcd) or die ("Requete de suppr ($query_suppr_vcd) invalide");
		if ($result_suppr_vcd) echo "<hr width=\"50%\"><i>Le VCD n°$vcd_suppr2 a bien été supprimé</i><hr width=\"50%\">" ;
		unset($suppr_vcd) ;
	}


		$query="SELECT * FROM vcd order by ANNEE,MOIS" ;
		$result2=mysql_query($query);
		while ($row2=mysql_fetch_array($result2))
		{
			$mois=$row2[mois];
			echo "<b><font size=-1>&nbsp;&nbsp;&nbsp;</font></b>$row2[titre] (<a href=$PHP_SELF?modif_vcd=$row2[id_vcd]#ancre>modif.</a> / <a href=vcd.php?id=$row2[id_vcd]>aperçu</a> / <a href=$PHP_SELF?vcd_suppr=$row2[id_vcd]#ancre>suppr.</a>)<br>\n" ;
			if ($modif_vcd==$row2[id_vcd])
			{
		  		 echo "<a name=\"ancre\"></z>";
				// on affiche le formulaire pour modifier _CE_ vcd
				 echo "<hr>MODIFICATION DE $row2[titre]<br><br>\n" ;
				 echo "<form name=\"modifiage_vcd\" action=\"$PHP_SELF\" method=\"post\">" ;
				 echo "<input name=\"vcd_modif2\" type=\"hidden\" value=\"$row2[id_boot]\">";
				 include_once ("form_vcd.php") ;
				 echo "</form>" ;
				 echo "<br><hr><br>\n" ;
			}
			if ($HTTP_POST_VARS[vcd_modif2]==$row2[id_vcd])
			{

				// requete d'update
				$query_update_vcd="UPDATE vcd SET titre='$HTTP_POST_VARS[titre]',lieu='$lieu',ville='$ville',pays='$pays',jour='$jour',mois='$mois',annee='$annee',qualite='$qualite',musiciens='$musiciens',cd1='$playlist1',cd2='$playlist2',infos='$infos',img='$img',is_new='$is_new',total_time='$total_time' where id_vcd='$vcd_modif2'";
				$result_update=mysql_query($query_update_vcd) or die ("Requete de modif ($query_update_vcd) invalide");
				if ($result_update) echo "<hr width=\"50%\"><i>Le VCD $titre a bien été modifié</i><hr width=\"50%\">" ;
				unset($vcd_modif2) ;
			}
			if (isset($vcd_suppr) && $vcd_suppr==$row2[id_vcd])
			{
		  		 echo "<a name=\"ancre\"></z>";
				echo "<hr width=\"40%\"><div align=center><a href=$PHP_SELF?vcd_suppr2=$row2[id_vcd]>CONFIRMER LA SUPPRESSION</a></div><hr width=\"40%\">";
			}

		}

?>
 NOUVEAU VCD ?..
<form name="infos" method="post" action="ajout_vcd.php">
  <? include_once ("form_vcd.php") ; ?>
</form>