PHP restriction d'envoi de formulaires par IP

Fermé
Squall_Williams Messages postés 10 Date d'inscription samedi 29 mai 2010 Statut Membre Dernière intervention 11 avril 2012 - 29 mai 2010 à 13:39
briiiiix Messages postés 575 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 1 juin 2010 - 29 mai 2010 à 15:58
Bonjour,

Je viens poster un message pour demander de l'aide. Effectivement, j'ai voulu faire une sorte de script PHP avec un formulaire qui s'enregistre dans une base de données SQL. J'ai réussi à mettre en place quelques protection antiflood comme un captcha et un header 403 pour pas qu'on puisse flooder en actualisant la page. Le problème est que, en faisant le bouton précédente, et qu'on renvoi la formulaire, on peut toujours flooder...

J'aurais voulu mettre en place un système pour que le formulaire enregistre l'IP du posteur, et que le posteur ne puisse envoyer que 2 formulaires maximum par adresses IP, mais n'y connaissant pratiquement rien en PHP, et ne trouvant rien sur internet, je n'y arrive pas...

Quelqu'un peut-il m'aider ?

Le script à la base est un script du site du zéro, que j'ai modifié pour en faire ce dont j'avais besoin avec le peu de connaissances que j'ai...

Voici mes fichiers PHP d'envoi de formulaire, et de confirmation d'envoi (la page qui vérifie le captcha et valide la requête.)

rediger.php: la page où figure le formulaire.

<?php
include ('design/design_haut.php');
{

    // Les variables $titre et $contenu sont vides, puisque c'est une nouvelle news
    $traitement = '<select name="traitement">
    "<option value="[ Plainte en cours ]" selected>Plainte en cours</option>"
	</select>';
    $auteur = '';
    $accuse = '';
    $forum = '';
    $nivaut = '';
    $nivacc = '';
    $screenniv = '';
    $histoire = '';
    $screens = '';
    $juger = 'Vous n\'avez pas la capacité de juger une plainte.';
    $jugement ='En attente.';
    $id_news = 0; // La variable vaut 0, donc on se souviendra que ce n'est pas une modification
}
?>

<script type="text/javascript">

function chiffres(event) {
	// Compatibilité IE / Firefox
	if(!event&&window.event) {
		event=window.event;
	}
	// IE
	if(event.keyCode < 48 || event.keyCode > 57) {
		event.returnValue = false;
		event.cancelBubble = true;
	}
	// DOM
	if(event.which < 48 || event.which > 57) {
		event.preventDefault();
		event.stopPropagation();
	}
}
</script>

<form action="verif_insc.php"  method="post">
<?
include ('design/entete.php');
include ('design/redaction.php');
?>
<p align="center">Préfixe : <? echo $traitement ?></p>
<p align="center">Auteur de la plainte * : <input type="text" size="25" name="auteur" value="<?php echo $auteur; ?>" /></p>
<p align="center">Pseudo forum de l'auteur: <input type="text" size="25" name="forum" value="<?php echo $forum; ?>" /></p>
<p align="center">Accusé * : <input type="text" size="25" name="accuse" value="<?php echo $accuse; ?>" /></p>
<p align="center">Niveau de l'auteur * : <input type="text" onkeypress="chiffres(event)" size="1" name="nivaut" value="<?php echo $nivaut; ?>" /></p>
<p align="center">Niveau de l'accusé * : <input type="text" onkeypress="chiffres(event)" size="1" name="nivacc" value="<?php echo $nivacc; ?>" /></p>
<p align="center">Screen du niveau de l'accusé * : <br><input type="text" size="60" name="screenniv" value="<?php echo $screenniv; ?>" /></p>

<p align="center">
    Histoire * :<br />
    <textarea name="histoire" cols="50" rows="10">
    <?php echo $histoire = (stripslashes($donnees['histoire'])); ?>
    </textarea><br /><br />
    
    Screens (Un par lignes) * :<br />
    <textarea name="screens" cols="50" rows="5">
    <?php echo $screens = (stripslashes($donnees['screens'])); ?>
    </textarea><br />
    <input type="hidden" name="id_news" value="<?php echo $id_news; ?>" /><br />
    
    Juger :<br />
    <textarea name="juger" cols="50" rows="2" disabled>
    <?php echo $juger ?>
    </textarea><br /><br />
    <p align="center"><input type="hidden" size="60" name="jugement" value="<?php echo $jugement; ?>" /></p>

    <!-- On affiche l'image générée par notre script -->
    <p><img src="verif_code_gen.php" alt="Code de vérification" /></p>

    <p><label>Merci de retaper le code de l'image ci-dessus</label> :
    <br><input type="text" name="verif_code" /></p>

    <input type="submit" value="Envoyer" />&nbsp;<INPUT type="reset" value="Tout effacer!">
</p>
</form>

<?
include ('design/liens_redac.php');
include ('design/liens_index.php');
include ('design/design_bas.php');
?>


verif_insc.php: la page autorisant l'envoi du formulaire si le code de confirmation est valide.

<?php
session_start(); // L'image utilise les sessions, donc on les active ici car on a besoin de ces informations
header("Status : 303 Moved Permanently");
header("Location: index.php");
//exit();

$milieu_html = NULL;
include ('design/design_haut.php');

if (isset($_POST['auteur']) AND !empty($_POST['auteur']))
if (isset($_POST['accuse']) AND isset($_POST['forum']) AND !empty($_POST['accuse']) AND !empty($_POST['forum']))
if (isset($_POST['nivaut']) AND isset($_POST['nivacc']) AND !empty($_POST['nivaut']) AND !empty($_POST['nivacc'])) 
if (isset($_POST['histoire']) AND isset($_POST['screens']) AND !empty($_POST['histoire']) AND !empty($_POST['screens'])) 
{

  $traitement = addslashes($_POST['traitement']);
  $auteur = addslashes(htmlentities($_POST['auteur']));
  $forum = addslashes(htmlentities($_POST['forum']));
  $accuse = addslashes(htmlentities($_POST['accuse']));
  $nivaut = addslashes($_POST['nivaut']);
  $nivacc = addslashes($_POST['nivacc']);
  $screnniv = addslashes(htmlentities($_POST['screenniv']));
  $histoire = addslashes(htmlentities($_POST['histoire']));
  $screens = addslashes(htmlentities($_POST['screens']));
  $jugement = addslashes(htmlentities($_POST['jugement']));

}

include ('design/entete.php');

if(IsSet($_POST['verif_code']) AND !Empty($_POST['verif_code'])) { // Le champ du code de confirmation a été remplis
     if($_POST['verif_code']==$_SESSION['aleat_nbr']) { // Si le champ est égal au code généré par l'image
          $milieu_html = 'Votre plainte à bien été enregistrée dans nos serveurs.<br>Elle sera traitée dans les plus brefs délais.<br>Merci d\'avoir dénoncé cet abus!<br><br><a href="index.php">Retour à l\'accueil.</a>';
     
       if ($_POST['id_news'] == 0)
  {
    mysql_query("INSERT INTO plainteshrp VALUES('', '" . $traitement . "' , '" . $auteur . "' , '" . $forum . "'  , '" . $accuse . "',  '" . $nivaut . "' , '" . $nivacc . "' , '" . $screenniv . "' ,  '" . $histoire . "' , '" . $screens . "' , '" . $jugement . "' , '" . time() . "')");
  }
}
     else {
          $milieu_html = 'Votre code de confirmation n\'est pas bon ! Merci de réessayer.<br /><a href="javascript:history.back();">Revenir à la page précédente.</a>';
     }
}
else {
    $milieu_html = 'Vous devez remplir le champ du code de confirmation !';
}

// Là, on affiche toute la source générée :
echo $milieu_html

?>


Si vous avez besoin d'autres informations, ou si je n'ai pas été très clair, n'hésitez pas à me demander!

Merci

A voir également:

2 réponses

briiiiix Messages postés 575 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 1 juin 2010 18
29 mai 2010 à 14:40
Je vois que ton script sert à envoyer un formulaire de plainte et que tu veux bien eviter que quelqu'un utilise F5 ou precedent ou quoi que ce soit pour renvoyer un formulaire déja valide.

Un e remarque, on passe par javascript pour detecter l'adresse ip de l'utilisateur.
Que fais tu si javascript est désactivé chez le client?
Autre problematique, pour une entreprise, ou bien des utilisateurs dans un bistrol, connectés à la même ligne, ils ont la même ip, tu fais quoi dans ce cas la?

Je te conseille de trouver une autre solution, cherche bien sinon revien vers moi pour une solution idéale.

Indication: Ajax
0
Squall_Williams Messages postés 10 Date d'inscription samedi 29 mai 2010 Statut Membre Dernière intervention 11 avril 2012 2
29 mai 2010 à 15:24
J'connais pratiquement rien en PHP donc bon... Trouver une autre solution.... :/
0
briiiiix Messages postés 575 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 1 juin 2010 18
29 mai 2010 à 15:34
J'ai posté ici une fonction qui envoi un formulaire en ajax.
Regarde la

https://forums.commentcamarche.net/forum/affich-17875146-est-ce-possible-avec-php-svp
0
Squall_Williams Messages postés 10 Date d'inscription samedi 29 mai 2010 Statut Membre Dernière intervention 11 avril 2012 2
29 mai 2010 à 15:48
Pas bien compris mais bon ... Ca marcherait meme si javascript est désactivé ?
0
briiiiix Messages postés 575 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 1 juin 2010 18
29 mai 2010 à 15:53
non, mais au mois si javascript est desactivé le formulaire ne sera même pas envoyé pour la premiere fois, et comme ça soit js est activé et tout fonctionne soit il est desactivé et rien ne fonctionne, on pourra egalement alerter l'utilisateur que son js est désactivé.
Pigé ?
0
Squall_Williams Messages postés 10 Date d'inscription samedi 29 mai 2010 Statut Membre Dernière intervention 11 avril 2012 2
29 mai 2010 à 15:56
Ouais, je vais essayer de mettre ça en place, même si j'sais pas comment je vais faire.

Merci^^
0
briiiiix Messages postés 575 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 1 juin 2010 18
29 mai 2010 à 15:58
essaie d'adapter ta fonction et je serais la pour t'assister
0