Quand le blocage d'IP bloque un IP non bloqué

Mammouth du PHP | 2937 Messages

02 juin 2006, 11:39

Salut à tous!

J'essaie de mettre au point un système permettant de bloquer l'IP après qu'un message a été envoyé, et ce pendant quelques minutes.

Pour cela, je crée une table dans la base de données.

Code : Tout sélectionner

CREATE TABLE `courriel` ( `id` int(11) NOT NULL auto_increment, `ip` text NOT NULL, `temps` bigint(20) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Ensuite, je code la page concernée par l'envoi de message et le blocage d'IP.
<?php 
session_start();
include ("sgbd/mysql.php");

// Paramètres du courriel
$destinataire='[email protected]';
$courriel=(!isset($_POST['courriel']))? '': $_POST['courriel'];
$courriel_confirmation=(!isset($_POST['courriel_confirmation']))? '': $_POST['courriel_confirmation'];
$objet=(!isset($_POST['objet']))? '': $_POST['objet'];
$saisie=(!isset($_POST['saisie']))? '': $_POST['saisie'];
$cle_primaire=(!isset($_POST['cle_primaire']))? '': $_POST['cle_primaire'];
$message=(!isset($_POST['message']))? '': $_POST['message'];
$en_tete='From: '.$courriel.'\nReply-to: '.$courriel.'\n';
$en_tete=str_replace('\r\n', '\n', $en_tete);

// Paramètres de l'IP
$requete_ip_selection="SELECT id, ip, temps FROM courriel WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
$resultat_ip_selection=mysql_query($requete_ip_selection);
$donnees_ip_selection=mysql_fetch_array($resultat_ip_selection);
$temps_blocage=time()-$donnees_ip_selection['temps'];
if (mysql_num_rows($resultat_ip_selection)!=0 && $temps_blocage>=120){
	$requete_ip_selection="DELETE FROM courriel WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
	$resultat_ip_selection=mysql_query($requete_ip_selection);
}

// Envoi du courriel et blocage de l'IP
if (isset($_POST['courriel']) && isset($_POST['courriel_confirmation']) && isset($_POST['message']) && isset($_POST['saisie']) && !empty($courriel) && !empty($courriel_confirmation) && !empty($message) && !empty($saisie) && $saisie==$_SESSION['confirmation_visuelle'] && $courriel_confirmation==$courriel){
	if ($resultat_ip_selection && $temps_blocage<120){
		$avis='Vous ne pouvez pas envoyer un nouveau message en si peu de temps. Cliquez <a href="contact.php" title="Contact">ici</a> pour retourner au formulaire.';
	}
	else{
		mail($destinataire, htmlentities($objet), stripslashes(htmlentities($message)), $en_tete);
		$avis='Votre message a bien &eacute;t&eacute; envoy&eacute;. Cliquez <a href="index.php" title="Contact">ici</a> pour revenir &agrave; l&rsquo;accueil.';
		$requete_ip_insertion="INSERT INTO courriel (ip, temps) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".time()."')";
		echo $requete_ip_insertion;
		mysql_query($requete_ip_selection);
		if (mysql_insert_id()==0) $avis='Votre message n&rsquo;a pas pu &ecirc;tre envoy&eacute;. Cliquez <a href="index.php" title="Contact">ici</a> pour revenir &agrave; l&rsquo;accueil.';
		else{
			$cle_primaire=mysql_insert_id();
			echo $cle_primaire;
		}
	}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="imagetoolbar" content="no"
<title>Contact</title>
<link href="css/styles.css" rel="stylesheet" type="text/css">
<link href="css/corps.css" rel="stylesheet" type="text/css">
</head>

<body>
<div id="page">
  <div id="corps">
    <h1>CONTACT</h1>
<?php 
if (!isset($_POST['courriel']) || empty($courriel) || !isset($_POST['courriel_confirmation']) || empty($courriel_confirmation) || $courriel_confirmation!=$courriel || !isset($_POST['message']) || empty($message) || !isset($_POST['saisie']) || empty($saisie) || $saisie!=$_SESSION['confirmation_visuelle']){
	// Afficher le formulaire
?>
    <p>Pour &eacute;crire au webmestre, veuillez remplir le formulaire ci-dessous. Les champs accompagn&eacute;s d&rsquo;un * sont obligatoires.</p>
    <form action="contact.php" method="post" name="contact" id="contact">
      Votre adresse &eacute;lectronique*&nbsp;:<br>
      <input name="courriel" type="text" id="courriel" size="70" value="<?php echo $courriel ?>"><br>
      Confirmez votre adresse &eacute;lectronique*&nbsp;:<br>
      <input name="courriel_confirmation" type="text" id="courriel_confirmation" size="70"><br>
      Objet de votre message&nbsp;:<br>
      <input name="objet" type="text" id="objet" size="70" value="<?php echo $objet ?>"><br>
      Votre message*&nbsp;:<br>
      <textarea name="message" cols="60" rows="6" id="message"><?php echo $message ?></textarea><br>
      Veuillez saisir les caract&egrave;res apparaissant ci-dessous*.<br>
      <img src="confirmation-visuelle.php" alt="Confimation visuelle" title="Confirmation visuelle"><br>
      <input name="saisie" type="text" id="saisie"><br>
      <input name="cle_primaire" type="hidden" id="cle_primaire" value="<?php if (mysql_num_rows($resultat_ip_selection)!=0) echo $donnees_ip_selection['id']; else echo 1; ?>">
      <input name="annul" type="reset" id="annul" value="Annuler" onClick="window.location.href='index.php'">
      <input name="envoi" type="submit" id="envoi" value="Envoyer">
    </form>
    <div id="revenir"><a href="#"><img src="images/haut_page.gif" alt="Revenir en haut de la page" title="Revenir en haut de la page"></a></div>
<?php 
}
else{
?>
    <p><?php echo $avis ?></p>
<?php 
}
?>
  </div>
</div>
</body>
</html>
Or, quand j'essaie la page et que je remplis en bonne et due forme le formulaire, lorsque je le valide, je tombe toujours sur le message "Votre message n'a pas pu être envoyé". :( Soit dit en passant, echo $requete_ip_insertion affiche bien la requête et la connexion à la base de données s'établit. Et, quand je vérifie la table, elle ne se remplit pas de la requête d'insertion.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 juin 2006, 12:27

Et où sont les "or die(mysql_error())" après tes mysql_query pour vérifier qu'il n'y a pas eu d'erreur sql lors de l'execution de la requête ? :)

Bon en fait non, y en a pas besoin, mais c'est pas une raison pour pas les mettre :
echo $requete_ip_insertion;
mysql_query($requete_ip_selection);

Mammouth du PHP | 2937 Messages

03 juin 2006, 17:17

Salut!

Suis-je bête! je me suis mêlé les pinceaux en confondant les variables. :oops:

Tout est rentré dans l'ordre.