8798 sujets

Développement web côté serveur, CMS

Pages :
bonjour,
le livre d'or de mon site internet a été pirater.

le pirate a posté 2 messages dans mon livre d'or : (je vous les donnes telque je les recoit par mail)

le 1er :
Nom : votre site contient une faille !
Message : <DIV id=Layer1 style=\"border:1px none #000000; Z-INDEX: 1; LEFT: 0; WIDTH:
2000px; POSITION: absolute; TOP: 0; HEIGHT: 4000px; BACKGROUND-COLOR: #000000;
layer-background-color: #000000\"><h1><font color=red>TEST SECURITE</font></h1></h2><font color=green>SIMPLE TEST DE SECURITER !! NE PAS PRENDRE EN COMPTE !! A SUPPRIME RAPIDEMENT !!</font></h3>
Site internet : ceci est pour vous !
email : je viens vous dire de la corriger
ip :
Ville : afin de vous aider a ameliorer le site


et le second :


Nom : didier
Message : <DIV id=Layer1 style=\"border:1px none #000000; Z-INDEX: 1; LEFT: 0; WIDTH:
9000; POSITION: absolute; TOP: 0; HEIGHT: 40000; BACKGROUND-COLOR: #000000;
layer-background-color: #000000\"><h1><font color=red>TEST SECURITE</font></h1></h2><font color=green>SIMPLE TEST DE SECURITER !! NE PAS PRENDRE EN COMPTE !! A SUPPRIME RAPIDEMENT !!</font></h3>
Site internet :
email : didider@hormail.fr
ip :
Ville : paris

du coup plus de page livre d'or sur mon site juste une page noire avec son texte.
j'ai quand meme reussi a recuperer ma page en supprimant de ma base de données les messages mais le probleme risque de se reproduire.

pourriez vous m'aider à corriger cette faille ?

mon formulaire est simple :

			  <form action="valide-livre.php" method="post" enctype="multipart/form-data"> 
    
   <table border="0" cellspacing="10" cellpadding="0">
     
     <tr>
       <td><div align="right">Votre adresse Ip</div></td>
       <td><?php
// on relève l'adresse IP du client comme dit dans le cours
$IPClient = $_SERVER[REMOTE_ADDR] ;
// affichage de l'adresse IP contenu dans la variable $IPClient
print ("$IPClient") ; 
?>
</td>
     </tr>
     <tr>
       <td><div align="right">* Nom</div></td>
       <td><input class="text" type="text" name="nom" /></td>
     </tr>
     <tr>
       <td><div align="right">Mail</div></td>
       <td><input class="text" type="text" name="email" /></td>
     </tr>
     <tr>
       <td><div align="right">Site</div></td>
       <td><input class="text" type="text" name="url" /></td>
     </tr>
     <tr>
       <td><div align="right">Ville</div></td>
       <td><input class="text" name="ville" type="text" id="ville" /></td>
     </tr>
     <tr>
       <td><div align="right">Note pour le site </div></td>
       <td><label>
         <select name="note" id="note" >
           <option value="10">10</option>
           <option value="9">9</option>
           <option value="8">8</option>
           <option value="7">7</option>
           <option value="6">6</option>
           <option value="5">5</option>
           <option value="4">4</option>
           <option value="3">3</option>
           <option value="2">2</option>
           <option value="1">1</option>
         </select>
         </label></td>
     </tr>
     <tr>
       <td><div align="right"> * Votre message </div></td>
       <td><textarea onblur="calculeLongueur();" onfocus="calculeLongueur();" onkeydown="calculeLongueur();" onkeyup="calculeLongueur();" name="message" id="message" maxlength="500"></textarea>
       <div id="indic">500 caractères disponibles</div>      </td>
     </tr>
     <tr>
       <td><p align="right">Code de v&eacute;rification</p>
         <p align="right"> <img src="imagesecu.php" alt="image de protection" /></p></td>
       <td><label for="verif">Recopiez le code de vérification </label><br />
         <input class="text" type="text" name="verif" size="10" maxlength="6" /></td>
     </tr>
     <tr>
       <td>&nbsp;</td>
       <td><input  name="submit2" type="submit" class="bouton" value="Valider" /></td>
     </tr>
   </table>
   <div align="right">     Les champs marqu&eacute;s d'une &eacute;toile (*) sont obligatoires </div>
</form>


et ma page de verification (validation du message) est la suivante :

<?PHP

// verification du code antispam
// On initialise la session 
session_start();
/* on vérifie que la code est toujours mémorisé en session et qu'il fait 6 caractères */ 
if(!isset($_SESSION['code']) || strlen($_SESSION['code']) != 6) die("Erreur !");

// on vérifie que la code entré est valide
if($_SESSION['code'] != $_POST['verif']) 
{ 
print("<center>Le '<b>code de verification</b>' est faut !</center>"); 
echo '<a href="javascript:history.back();">Retour</a>'; 
exit(); 

} 


// verification des champs nom et message
$nom = $_POST['nom']; 
$message = $_POST['message']; 

if(empty($nom)) 
{ 
print("<center>Le '<b>Nom</b>' est vide !</center>"); 
echo '<a href="javascript:history.back();">Retour</a>'; 
exit(); 

} 
if(empty($message)) 
{ 
print("<center>Le '<b>Message</b>' est vide !</center>"); 
echo '<a href="javascript:history.back();">Retour</a>'; 
exit(); 

} 




else 
{ 
$msg .= "Nom :\t$nom\n";  
$msg .= "Message :\t$message\n"; 
$msg .= "Site internet :\t$url\n";
$msg .= "email :\t$email\n";
$msg .= "ip :\t$ip\n";
$msg .= "Ville :\t$ville\n";



   
// récuperation de l'adresse IP
$ip = $REMOTE_ADDR;
// Envoi des infos vers Mysql
$sql = "INSERT INTO livreor(id, nom, email, url, ville, note, message, date, ip)
VALUES('','$nom','$email','$url','$ville','$note','$message',NOW(),'$ip')";
mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error()); 

mail('monadresse@wanadoo.fr', 'Nouveau message sur le livre dor', $msg , 'From: expediteur@monsite.fr'); 
echo 'Merci, votre message dans le livre dor a bien été ajouter'; 

mysql_close(); 
} 
// on détruit les variables de session, désormais inutiles pour le verif antispam
session_unset();
session_destroy();
?> 

<?php  echo '<a href="javascript:history.back();">Retour</a>'; ?>




Modifié par fabrice88 (25 Jul 2009 - 19:29)
bonjour,
donc si j'ai bien compris je n'ai rien a modifier dans mon formulaire mais je dois modifier mon page se validation du formualire ?

dans ce cas je dois utiliser la fonction mysql_real_escape_string mais je ne vois pas ou je dois ajouter cette fonction.
dans l'exemple qui est donné ils utilisent un "user" et un "password"

mysql_real_escape_string($user),
mysql_real_escape_string($password));

mais je n'ai aps ce genre de chose car tout le monde peut poster un message c'est un livre d'or.

pour l'htmlspecialchars je dois l'interer ou ?.
Modifié par fabrice88 (25 Jul 2009 - 19:37)
Tu dois les utiliser à la récupération des données.

$nom = htmlspecialchars(mysql_real_escape_string($_POST['nom']));  
$message = htmlspecialchars(mysql_real_escape_string($_POST['message']));  

Et de façon identique pour tous les champs récupérés et enregistrés dans la base de données.

Tu dois utiliser ces fonction dès que les informations viennent de l'utilisateur.
Comme l'a dit Heyoan, le B.A.BA est de ne jamais faire confiance à l'utilisateur. Smiley cligne
fabrice88 a écrit :
mais je n'ai aps ce genre de chose car tout le monde peut poster un message c'est un livre d'or.
Ben il faut adapter à tes champs : $_POST['nom'], $_POST['message'], $_POST['email'], etc.

htmlspecialchars est à utiliser lors de l'affichage de ton livre d'or sur les variables récupérées.

Tu peux voir un exemple dans ce post.

moust a écrit :

$nom = htmlspecialchars(mysql_real_escape_string($_POST['nom']));  
$message = htmlspecialchars(mysql_real_escape_string($_POST['message']));  
Euh... non : htmlspecialchars est inutile lors de l'insertion mysql. Cette fonction ne sert que pour l'affichage.
ok merci beaucoup, j'ai modifier ma page en suivant vos conseils.
j'ai donc pris l'exemple :
$nom = htmlspecialchars(mysql_real_escape_string($_POST['nom']));   

et je l'ai adapté à tous mes champs.
je vairai bien si dans le futur d'autre problemes se crée....

Si vous avez des conseils a me donner pour optimiser mon formulaire je suis preneur.

Merci un fois de plus.
fabrice88 a écrit :
$nom = htmlspecialchars(mysql_real_escape_string($_POST['nom']));   
Hum... au risque de me répéter : il ne faut pas utiliser htmlspecialchars avec mysql_real_escape_string. Smiley nuts
Modifié par Heyoan (25 Jul 2009 - 23:20)
ok ok dsl j'avais zappé un message.
donc j'ai juste lorsqu'il y a un inclusion vers sql à faire :

$nom = mysql_real_escape_string($_POST['nom']);   

et sa reglera mon probleme de mettre fait piraté ?

du cout je ne comprend pas très bien le htmlspecialchars et dans quel cas on doit l'utiliser.
fabrice88 a écrit :
...
mysql_real_escape_string($_POST['nom']);
...
et sa reglera mon probleme de mettre fait piraté ?
En l'occurrence non : le problème vient de ce que tu affiches des balises html qui sont donc interprétées car tu ne les protèges pas avec htmlspecialchars.

D'ailleurs tu ne t'es pas fait piraté mais gentiment avertir que tu ne protégeais pas les données soumises par tes visiteurs.
ok merci.

juste une petite dernière juste pour être sur.

est ce que j'ecri bien la fonction car on ne voi aucune différence au niveau de l'affichage du message ?

echo htmlspecialchars($data['message']);
fabrice88 a écrit :
car on ne voi aucune différence au niveau de l'affichage du message
C'est normal puisque cette fonction n'est utile que lorsque ta chaîne de caractères contient des éléments html susceptibles d'être interprétés comme tels.

Par exemple elle va remplacer
<p>bla bla</p>
par
&lt;p&gt;bla bla&lt;/p&gt;
aaah ok ok.
Alors du coup si un internaute veut utiliser des caractères du genre > < ....
son messages sera incompréhensible.
y'a il une solution pour à la fois garder la protection tout en gardant le texte réel qui serait afficher telqu'il a été ecrit ??
fabrice88 a écrit :
y'a il une solution pour à la fois garder la protection tout en gardant le texte réel qui serait afficher telqu'il a été ecrit ??
Euh... oui : htmlspecialchars. Smiley confuse
Edit: Arf ! Je viens de comprendre : en fait &lt;p&gt;bla bla&lt;/p&gt; s'affichera dans un navigateur comme <p>bla bla</p> (ce sont des entités html).

D'ailleurs il suffit de voir le code source de ce sujet pour le voir : sans cela les balises de nos messages serait interprétées.
Modifié par Heyoan (26 Jul 2009 - 22:28)
Heyoan a écrit :
Euh... non : htmlspecialchars est inutile lors de l'insertion mysql. Cette fonction ne sert que pour l'affichage.

En effet, j'ai été un peu vite en besogne ^^'
salut

je n'ai pas pû m'empêché de corriger ce code php pour le moins caricatural Smiley bawling


/**
 * Pour recuperer les ip proprement et plus surement.
 * 
 * ps: Franchement dans la session de manière transitoire, en cas
 * de problemes, elle y serait plus à sa place et la session servirait
 * au moins a quelque chose parce que la...Ouvrir une session pour une simple verif
 * c'est limite, mais bon.Et a quoi elle va te servir cette ip?
 *
 * @return string
 */
function recup_ip() {
	if (getenv("HTTP_CLIENT_IP")) {
		$ip = $_SERVER['HTTP_CLIENT_IP'];
	}
	elseif (getenv("HTTP_X_FORWARDED_FOR")) {
		$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	elseif (getenv("REMOTE_ADDR")) {
		$ip = $_SERVER['REMOTE_ADDR'];
	}
	else {
		$ip = 'adresse inconnue';
	}
	return $ip;
}

session_start();

// pas vraiment utile mais bon.
if(isset($_SESSION['code']) && strlen($_SESSION['code']) == 6) {
	// c'est plus logique;)
	if(isset($_POST['verif']) && $_POST['verif'] != $_SESSION['code']) {
	    die('<p>Le <b>code de verification est faux !</b> <a href="javascript:history.back();">Retour</a></p>');    
	}
	
	else {
  
		if(empty($_POST['nom'])) {  
			die('<p>Le <b>Nom est vide !</b> <a href="javascript:history.back();">Retour</a></p>');   
		}  else {
			$nom = trim(strip_tags($_POST['nom']));
		}

		if (empty($_POST['message'])) {  
			die('<p>Le <b>Message est vide !</b> <a href="javascript:history.back();">Retour</a></p>');   
		} else {
			$message = trim(strip_tags($_POST['message']));
		}

		if (empty($_POST['email'])) {
			$email = 'mail vide';
		} else {
			$email = trim(strip_tags($_POST['email']));
		}
		if (empty($_POST['url'])) {
			$url = 'url vide';
		} else {
			$url = trim(strip_tags($_POST['url']));
		}
		if (empty($_POST['ville'])) {
			$ville = 'ville vide';
		} else {
			$ville = trim(strip_tags($_POST['ville']));
		}
		if (is_numeric($_POST['note']) && $_POST['note'] < 11) {
			$note = $_POST['note'];
		} else {
			$note = 'note invalide';
		}
	
		$ip2 = recup_ip();
		$msg = "Nom :\t$nom\n";
		$msg .= "Message :\t$message\n";
		$msg .= "Site internet :\t$url\n";
		$msg .= "email :\t$email\n";
		$msg .= "ip :\t$ip2\n";
		$msg .= "Ville :\t$ville\n";
		// eventuellement htmlentities($msg);
		// la connexion est bien sur ouverte
		// on peut faire mieux avec sprintf mais c'est pas le sujet
		mysql_real_escape_string($nom);
		mysql_real_escape_string($message);
		mysql_real_escape_string($url);
		mysql_real_escape_string($ville);
		mysql_real_escape_string($email);
		// le reste des variables n'a pas besoin d'etre echappe
		$sql = "INSERT INTO livreor(id, nom, email, url, ville, note, message, date, ip) VALUES(NULL,$nom,$email,$url,$ville,$note,$message,NOW(),$ip2)"; 
		$req = mysql_query($sql);
		// toujours gerer les erreurs et pas avec or die!!
		if (!$req) {
			die('<p>Erreur de connexion <a href="javascript:history.back();">Retour</a></p>');
			$_SESSION['code'] = array();
			session_destroy();
		} else {
			if (false === mail('monadresse@wanadoo.fr', 'Nouveau message sur le livre d\'or', $msg , 'From: expediteur@monsite.fr')) {
				die('<p>Erreur! envoi du mail impossible.</p>');
				$_SESSION['code'] = array();
				session_destroy();
			} else {
				echo '<p>Merci, votre message dans le livre d\'or &agrave; bien &eacute;t&eacute; ajout&eacute;. <a href="javascript:history.back();">Retour</a>.<p>';
				$_SESSION['code'] = array();
				session_destroy(); 
			}
		}
	}
} else  {
	die('Code invalide en session');  
}


c'est y pas plus mignon? et au moins çà ressemble à du php Smiley lol
Hello,

Fabrice tu ne t'es pas fait pirater mais plutôt hacker...
Les hackers sont gentils et cherchent plutôt l'exploit informatique que de nuire alors que le pirate lui n'a pas d'état d'âme et ce fait plaisir à saboter ton travail.

C'est important de faire la nuance et estime toi heureux t'avoir toujours ta bdd Smiley cligne
Bonjour,

juste une petite remarque au niveau du code PHP proposé par keran.

if (false === mail('monadresse@wanadoo.fr', 'Nouveau message sur le livre d\'or', $msg , 'From: expediteur@monsite.fr')) { 


Ici, ça ne serait pas plutôt deux signes égales à mettre au lieu de trois ?
J'ai beau être un novice en PHP, mais je n'ai encore jamais vu trois signes égales à la suite.
Pages :