Php Token Anti CSRF
RésoluPatate -
Bonjour, me revoilà avec mes tokens anti CSRF je déploie ces tokens sur tous les formulaires de mon appli et là je rencontre l'erreur undefined index sur mes tokens.
Je m'explique : dans ma vue qui contient mon formulaire je génère un token et je met un champ caché dans le formulaire qui prend pour valeur le token.
<?php ob_start(); $token = generer_token('mail_rs'); //Je génère mon token ?> <form method="POST" enctype="multipart/form-data" action="<?= URL ?>rs/mailRsValid"> <div class="row"> <div class="form-group col-6 p-2"> <label for="depot_de_plainte">Liste de diffusion</label> <select class="form-control" name="id"> <?php for ($i = 0; $i < count($rs2); $i++) : ?> <option value="<?php echo htmlentities($rs2[$i]->getId()); ?>"><?= htmlentities($rs2[$i]->getNom()); ?> </option> <?php endfor; ?> </select> </div> <div class="form-group col-6 p-2"> <label for="travaux">Action en cours</label> <select class="form-control" name="actions"> <?php for ($i = 0; $i < count($actions); $i++) : ?> <option value="<?php echo htmlentities($actions[$i]->getDescriptionAction()); ?>"><?= htmlentities($actions[$i]->getDescriptionAction()); ?> </option> <?php endfor; ?> </select> </div> <div class="form-group col-6 p-2"> <label for="formFile" class="form-label">Ajout de fichier(s)</label> <input class="form-control" name='fichier' id='fichier' type="file"> </div> <div class="form-group col-6 p-2"> <label for="tech" class="form-label">Tech</label> <select class="selectpicker " multiple aria-label="multiple select example" id="cmblmail" name="cmbl[]" data-size="8" data-width="100%" multiple data-live-search="true" data-actions-box="true" title="" data-style="btn-white border"> <optgroup label="Normandie"> <?php for ($i = 0; $i < count($cmbl); $i++) { if ($cmbl[$i]->getZone() == "Normandie") { ?> <option value="<?= $cmbl[$i]->getNom() ?>"><?= $cmbl[$i]->getNom() ?></option> <?php } ?> <?php } ?> </optgroup> <optgroup label="Centre-Val de Loire"> <?php for ($i = 0; $i < count($cmbl); $i++) { if ($cmbl[$i]->getZone() == "Centre-Val de Loire") { ?> <option value="<?= $cmbl[$i]->getNom() ?>"><?= $cmbl[$i]->getNom() ?></option> <?php } ?> <?php } ?> </optgroup> </select> </div> <div class="form-group col-6 p-2"> <label class="form-label">Ajout derco ou ticket père</label> <input class="form-control" name='derco' type="text"> </div> </div> <input type="hidden" name="ville" value="<?= htmlentities($rs->getVille_id()); ?>"> <input type="hidden" name="cable" value="<?= htmlentities($rs->getTypeDeCables()); ?>"> <input type="hidden" name="type" value="<?= htmlentities($rs->getTypeAlerte()); ?>"> <input type="hidden" name="datefin" value="<?= htmlentities($rs->getDateDeRetablissement()); ?>"> <input type="hidden" name="date" value="<?= htmlentities($rs->getDatesHeuresAlarme()); ?>"> <input type="hidden" name="pilote" value="<?= htmlentities($rs->getPilote()); ?>"> <input type="hidden" name="nb_de_clients_impactes" value="<?= htmlentities($rs->getNbDeClientsImpactes()); ?>"> <div class="form-group col-md-8"> <br> <button type="submit" class="btn btn-primary bouton border-0" id="baseN2" data-mdb-ripple-color="dark" data-bs-toggle="modal" data-bs-target="#referencer">Envoyer</button> </div> <input type="hidden" name="token" id="token" value="<?php echo $token; ?>"/> // Mon champ caché qui a pour valeur le token </form> <?php $content = ob_get_clean(); $titre = "Envoi de mail - " . htmlentities($rs->getTypeAlerte()); require "views/template.php"; ?>
Dans une autre page php (RsManager.class.php) qui gère ici l'envoi d'un mail je met une condition pour vérifier que mon token est valide
public function mailRsBd($id, $ville, $cmbl, $fichier) { if(verifier_token(600, 'http://localhost/portail/rs/mailrs/' . $id, 'mail_rs')) { //Requete sql qui permet de sélectionner un utilisateur //Création du mail //Envoi du mail } else { // Pour afficher mes messages d'erreurs var_dump($_SESSION['mail_rs']); echo '<br><br>'; var_dump($_POST['token']); echo '<br><br>'; var_dump($_SESSION['mail_rs_time']); echo '<br><br>'; echo time(); echo '<br><br>'; var_dump($_SERVER['HTTP_REFERER']); echo '<br><br>'; if(isset($_SESSION['mail_rs']) && isset($_SESSION['mail_rs_time']) && isset($_POST['token'])){ if($_SESSION['mail_rs'] == $_POST['token']){ if($_SESSION['mail_rs_time'] >= (time() - 600)){ if($_SERVER['HTTP_REFERER'] == 'http://localhost/portail/rs/mail/59'){ echo 'token bien vérifié'; } else{ echo 'problème avec http_referer != http://localhost/portail/rs/mail/59'; } } else{ echo 'problème avec le time'; } } else{ echo '$_SESSION["mail_rs_token"] != $_POST["token"]'; } } else{ echo 'mail_rs, mail_rs_time, token ne sont pas tous isset'; } } }
Les fonctions verfier_token et generer_token dans mon index.php
function generer_token($nom = '') { $token = uniqid(rand(), true); $_SESSION[$nom.'_token'] = $token; $_SESSION[$nom.'_token_time'] = time(); return $token; } function verifier_token($temps, $referer, $nom = '') { if(isset($_SESSION[$nom.'_token']) && isset($_SESSION[$nom.'_token_time']) && isset($_POST['token'])){ if($_SESSION[$nom.'_token'] == $_POST['token']){ if($_SESSION[$nom.'_token_time'] >= (time() - $temps)){ if($_SERVER['HTTP_REFERER'] == $referer){ return true; } } } } else{ return false; } }
Et les message d'erreurs :
Notice: Undefined index: mail_rs in C:\Applications\wamp64\www\portail\models\RsManager.class.php on line 893
NULL
string(31) "31792904637cc5e35b3ca3.88068889"
Notice: Undefined index: mail_rs_time in C:\Applications\wamp64\www\portail\models\RsManager.class.php on line 897
NULL
1669121518
string(43) "http://localhost/portail/rs/mailrs/59"
mailRs_token, mailRs_token_time, token ne sont pas tous isset
Comment avoir accès à mon token générer dans ma vue ?
- Token php
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Php alert ✓ - Forum PHP
- Alert PHP - Forum PHP
- Retour à la ligne php ✓ - Forum PHP
3 réponses
Bonjour,
Dans ton fichier RsManager.class.php, à la ligne , fais donc des var_dump de $_POST et de $_SESSION ... et regarde ce que ça t'affiche...
Okay j'ai essayé de mettre l'id en statique dans mon if au lieux de
'http://localhost/portail/rs/mailrs/' . $id
J'ai mis
'http://localhost/portail/rs/mailrs/59'
Et ça m'a bien envoyé mon mail de l'id 59 mais mtn j'aimerais mettre $id mais j'ai toujours ce 31 qui reviens et je ne sais pas du tout à quoi il correspond il y a aucun id 31 en plus dans ma table.
J'ai capté en fait pour remettre dans le contexte je choisis quelque chose qui a un id pcq c dans ma bdd que j'envois à une liste de diffusion qui a aussi un id et en fait au lieux de prendre l'id de mon truc que j'envois, celui qui est dans la barre d'url, il prend l'id de la liste de diffusion à laquelle j'envois le mail.
L'appel de ma fonction mailRsBd dans mon controller
public function mailRsValidation() { $this->rsManager->mailRsBd( $_POST['id'], $_POST['clients_impactes'], $_POST['pilote'], $_POST['actions'], $_POST['der'], $_POST['date'], $_POST['type'], $_POST['cable'], $_POST['datefin'], $_POST['ville'], $_POST['bml'], $_FILES["fichier"] ); //header('Location: ' . URL . "rs", "X-XSS-Protection: 1; mode=block"); }
Du coup l'id que j'ai dans les paramètres de ma fonction mailRsBd est celui de la liste de diffusion et non pas de mon rs
public function mailRsBd($id, $ville, $cmbl, $fichier) {}
A noter : je reprend du code qui n'est pas le miens donc je déchiffre peu à peu ce qui a été fait.
EDIT : Je viens d'afficher le $_POST['id'] qu'il y a dans le Controller pcq je pensais que lui prenais l'id de mon RS mais nan il prend aussi l'id de la liste de diffusion. WTF comment il sait quoi envoyer ??
Merci de ton retour,
var_dump($_POST)
var_dump($_SESSION)
On peut voir que j'ai bien mes deux token de mail pourtant :
Et maintenant, regarde la ligne correspondant à tes messages d'erreur .... (compare le nom des variables avec ceux que tu as en session... )
Si tu fais allusion à
comparé à
C'est normal sur tous mes autres token c'est pareil et ça fonctionne, si tu regarde ces deux fonctions :
J'ai quand même essayé ça pour être sur mais ça ne fonctionne pas :
Il faut bien garder mail_rs dans l'appel de ta fonction
¨Par contre, je parlais des messages d'erreurs liés à tes var_dump .. pas du fonctionnement de ta fonction.
Pour ta fonction, ajoutes y des else et du debug pour comprendre ce qui n'est pas bon.
par exemple
J'ai changé ma fonction par la tienne,
Voici le résultat :
J'comprend pas bien à ce moment là on dirait qu'il prend plusieurs mails