$_GET et htmlspecialchars() [Résolu]

Signaler
Messages postés
12
Date d'inscription
jeudi 10 janvier 2019
Statut
Membre
Dernière intervention
16 janvier 2020
-
Ibrahim_76
Messages postés
12
Date d'inscription
jeudi 10 janvier 2019
Statut
Membre
Dernière intervention
16 janvier 2020
-
Bonjour à tous,

Je sollicite votre aide concernant un problème que j'ai rencontré sur mon site web.

J'ai un formulaire qui permet d'ajouter des news sur mon blog, il fonctionne parfaitement.
Lorsque l'utilisateur fait une erreur (choisis un pdf au lieu d'une photo pour l'illustration), ça fonctionne également, cependant je souhaiterai garder la saisie de l'utilisateur dans le formulaire afin qu'il ne l'ai pas à réécrire le contenu et le titre.

J'y arrive, mais il y a une variable qui ne passe pas.

Pour l'envoi du formulaire, j'envoie mes 2 variables $_POST['title'] et $_POST['content'].

<form method="POST" action="index.php?action=addPost" enctype="multipart/form-data">
        <div class="row">
            <div class="col-25">
                <label for="title">Titre du billet</label>
            </div>
            <div class="col-75">
                <input type="text" maxlength="20" size="25" name="title" required value='<?php 
                    if(isset($_GET['title'])){
                        echo $_GET['title'];
                    }
                ?>'>
                <input type="file" id="avatar" name="avatar" required><br>
            </div>
        </div>
        <div class="row">
            <div class="col-25">
                <label for="content">Contenu</label>
            </div>
            <div class="col-75">
                <textarea class="tiny" col="45" row="45"type="text" style="height:200px" name="content">
                <?php 
                    if(isset($_GET['content'])){
                        echo $_GET['content'];
                    }
                ?>
                </textarea><br>
                <input type="submit" class="boutons" value="Envoyer">
            </div>
        </div>
    </form>


Lorsque je récupère les variables, je leur applique le htmlspecialchars() avant de les envoyer au controller :

case 'addPost' : // lancement ajout
            addPost($_FILES,htmlspecialchars($_POST['title']),htmlspecialchars($_POST['content']),htmlspecialchars($_SESSION['pseudo']));
            break;


Je récupère les données, tout fonctionne, cependant lorsqu'il y a une erreur et que j'envoie les données en $GET via l'url afin de les récupérer à nouveau dans le formulaire, il n'y a que le title qui passe, et pas le $_GET['content']

catch (Exception $e){
        header('Location: index.php?action=add&title='.$title.'&content='.$content.'&message='.$e->getMessage());
    }


Et bizarrement, lorsque je supprime le htmlspecialchars() pour le content, ça fonctionne.

J'utilise tinyMCE pour le content, peut-être que c'est lié?

J'aimerai juste comprendre pourquoi ce problème.

Merci d'avance pour votre aide :)

2 réponses

Messages postés
27333
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
23 janvier 2020
2 034
Bonjour,

Plusieurs choses....

htmlspecialchar est une fonction qui ne doit s'utiliser QUE pour de l'affichage.... jamais avant l'insertion en BDD.

Les url peuvent être limitées en taille... donc si tu balances tout ton contenu dans l'url.. ça peut ne pas passer

Les textarea envoient les sauts de ligne en caractères "nl" ... alors que les retours à la ligne html sont des balises BR
Tu peux essayer d'utiliser la fonction nl2br() pour convertir...

plutot que de passer par l'url pour renvoyer les données dans le formulaire je te conseillerai d'utiliser des cookies ou le localstorage du navigateur...



Ibrahim_76
Messages postés
12
Date d'inscription
jeudi 10 janvier 2019
Statut
Membre
Dernière intervention
16 janvier 2020

Bonjour,
Merci pour ta réponse rapide.

J'utilise la fonction htmlspecialchars pour éviter les injections XSS.

C'est une bonne idée d'utiliser les cookies ou le local storage, merci pour l'astuce, je n'y avais pas pensé.
salut,
curieux aussi que vous ayez des données en GET alors que le formulaire est en POST. Vous passez pas une réécriture dans l'URL quelque part ce qui permettrais d'ajouter des données GET 'manuellement' ?
Ibrahim_76
Messages postés
12
Date d'inscription
jeudi 10 janvier 2019
Statut
Membre
Dernière intervention
16 janvier 2020

Bonjour,

Oui, le formulaire est en $POST, et une fois les données traitées, je les récupère et je les transmets en $GET à la page.
C'est le seul moyen que j'ai trouvé afin de pouvoir réupérer les données mais l'idée de jordane45 est intéréssante.
Merci à vous.