Livre or - contrôle flood

Eléphanteau du PHP | 21 Messages

12 févr. 2006, 17:26

Bonjour,
j'ai pris le script du livre d'or du site du zéro sur mon site, et je suis en train d'essayer de rajouter 2/3 trucs pour le sécuriser. Je voudrais contrôler les abus de flood, et comme le livre marche avec un <form> HTMl qui renvoie sur la même page, j'ai mis en place une variable $deja_poste qui est crée si les $_POST existe (donc si la personne vient de poster).
Ensuite, si la personne re-essaye de poster, je regarde si $deja_poste existe,dans quel cas les données ne seront pas re-erntrés dans la BDD .

Bref, je ne crois pas avoir été très clair, je vous montre mon code, il ne marche pas et me crée même une erreur d'header (et je ne vois pas ce que ca vient faire là!) :
if (isset($_COOKIE["livreorsecuritycenter"])) { $deja_poste = 1; } 

if (isset($_POST['pseudo']) AND isset($_POST['message']) )
{
    
    $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité
        
    $message = htmlentities($_POST['message'], ENT_QUOTES); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
    
	$expire = 2*24*3600;  // on définit la durée du cookie, 1 an
	setcookie("livreorsecuritycenter","dejaposte",time()+$expire);  // on l'envoi
 

if (strlen($_POST['pseudo']) >= 3 AND strlen($_POST['message']) >= 5 AND $deja_poste != 1) { 

 // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
} else {
echo '<b><br>';
echo '<font color=red>Vous devez entrer un pseudo ou un message plus long !</font>';
echo '</b><br>';
}
}
Erreur :
Warning: Cannot modify header information - headers already sent by (output started at /home/security/public_html/v2_azertyuiop/livreor.php:16) in /home/security/public_html/v2_azertyuiop/livreor.php on line 59
Et on peut encore flooder ... Merci d'avance pour votre aide :wink:

ViPHP
ViPHP | 649 Messages

12 févr. 2006, 19:16

setcookie("livreorsecuritycenter","dejaposte",time()+$expire); // on l'envoi

Ce doit être la ligne 59 non?

Tu ne peux pas envoyer aucun code HTML avant d'éxécuter cette fonction.

Personnellement, j'ai jamais vu de flood sur un livre d'or, ce que tu peux faire, c'est n'autoriser que les membres enregistrer à poster, et lorsqu'il poste, tu fais un SELECT COUNT(*) FROM livreor WHERE pseudo=$_SESSION['username']. Si ça te retourne 1, il a déjà posté, on le refuse, sinon, on accepte.
Image

Eléphanteau du PHP | 21 Messages

12 févr. 2006, 22:45

Je n'ai pas de membre sur mon site, tu comprends le dilemne ...
Si si ya du flood sur certains livre d'or, et je n'en veux pas chez moi ^
Je ne peux donc pas créer de cookie quand on regarde le cas dans lequel je suis ... :cry:

Enfin, je vais essayer de mieux exposer mon problème, quand on arrive sur le livre il n'y a aucune erreur, c'est quand on post un message : ce dernier est bien posté, on le voit dailleurs, mais il y a cette erreur avec en dessous tous les messages.
Ligne 59 : setcookie("livreorsecuritycenter","dejaposte",time()+$expire);
Comment faire ? Merci d'avance

ViPHP
ViPHP | 649 Messages

12 févr. 2006, 22:55

Ou j'avais une autre idée, ce serait d'enregistrer le IP du posteur, ainsi, limite d'un message par ordinateur :
<?php
if (isset($_POST['message']))
{
$message = mysql_escape_string($_POST['message']);

$date = time();
$ip = $_SERVER['REMOTE_ADDR'];

mysql_connect("localhost", "user", "pass");
mysql_select_db("base");

$count = mysql_query("SELECT COUNT(*) AS nbre_ip FROM livreor WHERE ip='$ip'");
$dcount = mysql_fetch_array($count);

$nombre = $dcount['nbre_ip']; // Le nombre de messages provenant de cet ordinateur

      if ($nombre == 0) //Si c'est le premier message, on insère
      {
       mysql_query("INSERT INTO livreor ('date','message','ip') VALUES('$date','$message','$ip'");
       echo 'Message enregistré';
      }
      else
      {
       echo 'Vous avez déjà posté';
      }

mysql_close();
}
else
{
//Notre formulaire html
?>
<form action="livreor.php" method="post">
        <label for="message">Votre message :</label><br />
        <textarea name="message" id="message"></textarea><br />
        <input type="submit" value="Soumettre" />
</form>
<?php
}
?>

Voilà, c'est semblable au cookie, mais cette fois avec MySQL, c'est la meilleure solution que je vois :-k
Image

Eléphanteau du PHP | 21 Messages

12 févr. 2006, 23:24

Ok, je viens de faire ta technique et ca marche.
Merci pour ton aide :o