echo '<input type="hidden" name="time" value="'.time().'" />';
Le principe est d'associer au formulaire une valeur de temps qui permet de l'identifier : en cas de rechargement de la page de soumission (ou de retour en arrière qui passerait par cette page), cette valeur fera partie des valeurs soumises, et donc ne changera pas, ce qui permettra de tester son existence en base et donc de savoir si le formulaire a déjà été soumis.header("Location: lapageformulaire.php");
je vais me pencher sur la technique de calimero quand même
Je ne comprends pas cette dernière phrase. Je pensais que les pirates qui utilisent cette méthode faisaient une copie graphique du site cible mais qu'ils maitrisaient totalement le traitement des données puisqu'on est réellement sur leur site. Non?Tu garantis également qu'il est impossible de créer un faux formulaire sur un autre site pour faire du phishing.
Code : Tout sélectionner
<form action="http://le_site_original" method="post">
<input type="hidden" name="montant" value="1000000€">
<input type="hidden" name="destination" value="moi">
<input type="submit" value="Cliquez ici si vous aimez la glace au chocolat">
</form> //Securisation des formulaires
function db_veri_form($jeton='')
{
if ($jeton=='')
{
$jeton=time()."-".mt_rand(100000000,999999999);
$this->db_exec("INSERT INTO entrant(ip,jeton) VALUES ('".$_SERVER['REMOTE_ADDR']."','".$jeton."');"); //+- mysqli_query
print '<input type="hidden" name="entrant" value="'.$jeton.'">';
return $jeton;
} else
{
$this->db_select("SELECT ip,jeton FROM entrant WHERE jeton='".$jeton."';"); //+- mysqli_query (rend un tableau)
if ($this->req[0]==array(ip=>$_SERVER['REMOTE_ADDR'],jeton=>$jeton))
{
$this->db_exec("UPDATE entrant SET jeton='".time()."' WHERE jeton='".$jeton."';"); //+- mysqli_query
return true;
} else
{
return false;
}
}
}
La table correspondante est
Code : Tout sélectionner
CREATE TABLE `entrant` (
`id` int(10) unsigned NOT NULL auto_increment,
`jeton` varchar(20) default NULL,
`ip` varchar(15) default NULL,
PRIMARY KEY (`id`)
)
//Securisation des formulaires
function db_veri_form($jeton='')
{
if ($jeton=='')
{
$jeton=time()."-".mt_rand(100000000,999999999);
$this->db_exec("INSERT INTO entrant(ip,jeton) VALUES ('".$_SERVER['REMOTE_ADDR']."','".$jeton."');"); //+- mysqli_query
print '<input type="hidden" name="entrant" value="'.$jeton.'">';
} else
{
$this->db_select("SELECT ip,jeton FROM entrant WHERE jeton='".$jeton."';"); //+- mysqli_query (rend un tableau)
if ($this->req[0]==array(ip=>$_SERVER['REMOTE_ADDR'],jeton=>$jeton))
{
$this->db_exec("UPDATE entrant SET jeton='".time()."' WHERE jeton='".$jeton."';"); //+- mysqli_query
return true;
} else
{
return false;
}
}
}
CQFD pour une sécurité maximumMoi qui pensait n'avoir à vérifier que ce qui est saisi par l'utilisateur et je prend conscience qu'il me faudra vérifier tout ce qui est envoyé par un formulaire saisi ou nom par l'utilisateur.
Les caractères supplémentaires sont ignorés, seul le compte de caractères entre dans le champ.Toujours dans le domaine de la sécurité:
si j'ai un champ de sql qui fait une taille de, disons, 100.
est-ce que je dois faire un test strlen avant ou après avoir échappée ma chaine?
(en d'autre terme, si l'utilisateur entre une chaine de 100 caractère qui serons tous échappés, cela fera une taille de 200 caractères au final. Mais est-ce que les caractère sont stockés "échappés", ou est-ce que cela est enlevé a la requète?)
PHP n'est pas sensé s'arrêter de lui même lorsque l'on commande une redirection par header, les header sont des informations génériques, ils sont envoyés tels quels, sans traitement particulier par php. Et le client n'est pas tenu de couper la connexion lorsqu'il reçoit le header, il a très bien le droit d'attendre le header ET le contenu de la page, et si le client ne coupe pas la connexion, le serveur lui enverra. Ce qui signifie que si on fait une redirection par header, et que l'on veut que le script s'arrête, alors on arrête le script soit même...Et concernant les headers, est-ce que leur execution est coté serveur ou coté client?
C'est-a-dire, est-ce qu'il est suffisant de faire un header('location: adresse_ou_tu_degage.php') si je détecte une erreur, ou est-ce que en parametrant son explorateur, le client pourra forcer mon script a continuer de s'exécuter?