Eviter le SPAM et le piratage

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 14:46

Bonjour,

Je voudrais savoir si un robot / pirate qui est confronté à un formulaire donc les champs "name" sont crypté, pourrait t'il pourrais encore passer au travers ?

Merci
Exemple :
<?php
session_start();     #Ouverture de session



#Création dynamic des nom de champs

$_SESSION['form_nom']              = md5('nom'.date('r'));           #Création du nom 'nom' crypté et ajouter de la date
$_SESSION['form_prenom']           = md5('prenom'.date('r'));        #Création du nom 'prénom' crypté et ajouter de la date
$_SESSION['form_mail']             = md5('mail'.date('r'));          #Création du nom 'Mail' crypté et ajouter de la date
$_SESSION['form_commentaire']      = md5('commentaire'.date('r'));   #Création du nom 'commentaire' crypté et ajouter de la date
$_SESSION['form_bouton']           = md5('bouton'.date('r'));        #Création du nom 'SUBMIT' crypté et ajouter de la date


#Formulaire HTML

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

<head>
<meta http-equiv="Content-Language" content="fr-be" />
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-15" />
<title>Formulaire de contact.</title>
</head>

<body>

<form method="POST" action="validation.php">
	<fieldset style="font-style: oblique; color: #0000FF; width: 558; height: 320; border: 1px solid #0000FF; background-color: #EFEFEF">
	<legend>Formulaire</legend>
	<table border="0" width="100%" id="table1">
		<tbody>
		<tr>
			<td width="101">Nom :</td>
			<td>
			<input type="text" value="" name="<?php echo $_SESSION['form_nom'];?>" style="border-style: solid; border-width: 0px" /></td>
		</tr>
		<tr>
			<td width="101">Prénom :</td>
			<td>
			<input type="text" value="" name="<?php echo $_SESSION['form_prenom'];?>" style="border-style: solid; border-width: 0px" /></td>
		</tr>
		<tr>
			<td width="101">E Mail :</td>
			<td>
			<input type="text" value="" name="<?php echo $_SESSION['form_mail'];?>" style="border-style: solid; border-width: 0px" /></td>
		</tr>
		<tr>
			<td width="101" valign="top">Commentaire :</td>
			<td><textarea rows="8" name="<?php echo $_SESSION['form_commentaire'];?>" cols="39" style="border-style: solid; border-width: 0px" ></textarea></td>
		</tr>
	</tbody>
	</table>
	<p align="center"><input type="submit" value="Envoyer" name="<?php echo $_SESSION['form_bouton'];?>" /></p>
	<p>&nbsp;</p>
	</fieldset></form>

</body>

</html>
Parce que je part de la logique (peut-être fausse ?) qu'il doit pouvoir lire les champs pour les remplir

Merci
Modifié en dernier par dunbar le 28 mai 2008, 17:49, modifié 2 fois.

Mammouth du PHP | 19672 Messages

16 mai 2008, 15:09

Que se passera-t-il avec l'internaute qui affiche le formulaire à 23h59 et qui clique sur le bouton d'envoi à 0h00 ? J'essayerais plutôt d'utiliser un système de noms stockés en session au moment de la création du formulaire pour être certain de récupérer les mêmes à la validation.

L'intérêt de ton idée est qu'aucun robot ne pourra utiliser le formulaire efficacementr, le nom des champs changeant à chaque nouvel affichage : ça coupe toute possibilité d'envoi de données depuis une copie du formulaire sur le site du pirate lui-même. Second intérêt, c'est que le nom de chaque champ n'ayant aucun sens, le robot ne saura pas quel type de donnée est attendue : la validation éjectera rapidement la validation : il manquerait peut-être un compteur de tentatives avec un chronomètre pour parer les possibles attaques en force brute... mais bon, c'est peut-être excessif :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 15:21

il manquerait peut-être un compteur de tentatives avec un chronomètre pour parer les possibles attaques en force brute... mais bon, c'est peut-être excessif
:lol: J'ai pas oser montrer cette partie mais le formulaire reste valable 10 minutes sinon il est rejeter.
$date = md5('SEL' .date('Y-m-d h:i:00");
La validation
$validation = range(0, 10);  #entre 0 et 10 minutes sinon refus du formulaire
$valide = false ;
foreach($validation as $v){
	if($valide|= ($_POST['date']) == md5('Sel'.date('y-m-d h:i:00', mktime() +$v * 60 ))){

	       

Donc pour une fois mon idée n'étais pas trop mauvaise :wink:
Quand à mes session arrête moi si je me trompe, la session se créer à l'ouverture du formulaire et se termine une fois celui-ci valider donc comme je place les valeurs de mes champs en session je ne sait pas les perdre :-k
Et les test me montre que je récupére bien les bonne valeur .
Modifié en dernier par dunbar le 16 mai 2008, 15:36, modifié 1 fois.

Mammouth du PHP | 19672 Messages

16 mai 2008, 15:33

La session reste valide tant que l'internaute reste connecté au site... pour autant que tu n'oublies pas un session_start() en cours de route. Ceci dit, une fois le formulaire valider, tu as aussi la possibilité de vider les valeurs de session propres au formulaire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 15:37

La session reste valide tant que l'internaute reste connecté au site... pour autant que tu n'oublies pas un session_start() en cours de route. Ceci dit, une fois le formulaire valider, tu as aussi la possibilité de vider les valeurs de session propres au formulaire.
Je détruit le session une fois le formulaire valider
Donc merci je continue sur ma lancer, puisque tu me semble d'accord sur le principe :wink:

ViPHP
AB
ViPHP | 5818 Messages

16 mai 2008, 17:07

Peut-être lu trop vite mais je ne comprend pas cette histoire de validation limitée à 10 minutes.

Etant donné que les noms de tes champs sont uniques et valides uniquement pour la durée de la session, ils ne seront utilisables que pour cette session.

Donc pour que ton formulaire ne puisse pas être copié et utilisé de l'extérieur (en dehors de la session en cour) une simple validation de type if(isset($_POST[$_SESSION['form_nom']])... devrait suffire :-k

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 17:28

Peut-être lu trop vite mais je ne comprend pas cette histoire de validation limitée à 10 minutes.

Etant donné que les noms de tes champs sont uniques et valides uniquement pour la durée de la session, ils ne seront utilisables que pour cette session.

Donc pour que ton formulaire ne puisse pas être copié et utilisé de l'extérieur (en dehors de la session en cour) une simple validation de type if(isset($_POST[$_SESSION['form_nom']])... devrait suffire :-k
Je travaillais sur deux pistes :

:arrow: La première étais une durée vie au formulaire pour évité principalement l'exporation de celui-ci etc....
:arrow: La seconde piste étais celle de crypté le formulaire.

J'ai opter pour la seconde solution donc éffectivement donner une durée de vie à mon formulaire n'a plus aucun sens.
Le cas que j'utilise est celui des session que je détruit une fois le formulaire valider et comme chaque session est unique je pense que je suis tranquille :wink:

Mammouth du PHP | 19672 Messages

16 mai 2008, 23:18

Quand je parlais de chronomètre, ce n'était pas une question de durée de vie de formulaire mais de mesure d'écart entre deux tentatives de validation pour une même session : si tu as par exemple 10 tentatives en moins de 3 minutes, il y a fort peu de chances pour que ce soit un humain qui soit derrière.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 23:25

10 tentatives en moins de 3 minutes, il y a fort peu de chances pour que ce soit un humain qui soit derrière.
Tu ma jamais vue m'énervé sur mon clavier :!: :lol:
Je plaisante oui pourquoi pas je vais étudier la mise en place
Merci

ViPHP
AB
ViPHP | 5818 Messages

17 mai 2008, 04:46

10 tentatives en moins de 3 minutes, il y a fort peu de chances pour que ce soit un humain qui soit derrière.
Tu ma jamais vue m'énervé sur mon clavier :!: :lol:
Je plaisante oui pourquoi pas je vais étudier la mise en place
Merci
Effectivement si tu te lance dans ce genre de contrôle tu as intérêt de bien calibrer le processus. Parce que j'irai jusqu'à dire que s'il n'y a que 10 tentatives en 3 minutes, il y a fort peu de chances pour que ce soit un robot qui soit derrière.
Ou alors c'est un robot farniente qui a su acquérir des droits sociaux bien supérieurs aux nôtres :lol:

Mammouth du PHP | 19672 Messages

17 mai 2008, 07:38

...j'irai jusqu'à dire que s'il n'y a que 10 tentatives en 3 minutes, il y a fort peu de chances pour que ce soit un robot qui soit derrière...
Sauf que ce n'est pas par rapport aux performances d'un robot que je ferais mes mesures mais par rapport aux performances humaines. Les meilleures dactylos tapent jusqu'à 120 mot/minute : l'internaute lambda ne doit pas dépasser 30 ou 40. Donc au départ, je sais à peu près à quel stade il est certain que ce n'est pas un humain à qui j'ai affaire. Mais attention toutefois à un point important : certains robots évoluent et en tiennent compte aussi. Selon le langage dans lequel il est écrit, il est possible d'utiliser un système pour temporiser entre deux tentatives. En PHP on a sleep() par exemple.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2291 Messages

27 mai 2008, 22:30

ou encore mieux usleep(100000) = 1/10 de seconde qui est invisible pour un être humain, mais gêne considérablement une attaque par force brute par exemple :?

ViPHP
AB
ViPHP | 5818 Messages

27 mai 2008, 22:39

ou encore mieux usleep(100000) = 1/10 de seconde qui est invisible pour un être humain, mais gêne considérablement une attaque par force brute par exemple :?
Hum, je crois pas que tu ait bien saisi la dernière réponse de Cyrano, qui disait (si j'ai bien compris) que les robots peuvent éventuellement utiliser la fonction sleep pour simuler un comportement humain...

ViPHP
ViPHP | 2291 Messages

27 mai 2008, 22:48

ou encore mieux usleep(100000) = 1/10 de seconde qui est invisible pour un être humain, mais gêne considérablement une attaque par force brute par exemple :?
Hum, je crois pas que tu ait bien saisi la dernière réponse de Cyrano, qui disait (si j'ai bien compris) que les robots peuvent éventuellement utiliser la fonction sleep pour simuler un comportement humain...
Si je pense avoir bien compris je m’explique :
Si le site répond en une milliseconde par exemple un pirate ou un srcipt automatique pourra tester +/- mille mots par seconde !
Avec un usleep(100000) ont réduit considérablement la vitesse d’attaque à +/- 10 par seconde :)
Modifié en dernier par dunbar le 28 mai 2008, 17:49, modifié 1 fois.

ViPHP
ViPHP | 5924 Messages

28 mai 2008, 00:41

On ne cherche pas à limiter des attaques, on veut que les robots ne puissent pas poster une seule fois…