IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire ayant des antislashes [Fait]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Formulaire ayant des antislashes
    Bonjour,
    je rencontre un soucis sur les antislashes lorsque je passe d'une page à une autre.
    par exemple,si je saisie entre guillemet "Mot \\"
    si je vais sur la page 2, je vais retrouver dans mon formulaire "Mot \\\\"
    voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche']));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $mots = split(" +",$recherche);
     
    $nombre_mots = count ($mots); //compte le nombre de mots
     
    $valeur_requete = '';
    for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
    {
     
    $valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
    $valeur_requete2 .= '' . $and_ou_or . ' description LIKE \'%' . $mots[$nombre_mots_boucle] . '%\'';
    $valeur_requete3 .= '' . $and_ou_or . ' content_id LIKE \'%' . $mots[$nombre_mots_boucle] . '%\'';
    }
    $valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
    $valeur_requete2 = ltrim($valeur_requete2,$and_ou_or);
    $valeur_requete3 = ltrim($valeur_requete3,$and_ou_or);

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Bonjour,

    Tu dois avoir les vilains magic_quotes activés sur ton serveur.

    Desactive les ou au pire du pire, tu vas devoir stripslashe() tes variables $_POST.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Non ils sont bien désactivés et si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $recherche = mysql_real_escape_string(stripslashes(htmlspecialchars($_POST['recherche'])));
    alors c'est l'effet inverse, si je mets c:\ je retrouve c:

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    par exemple,si je saisie entre guillemet "Mot \\"
    si je vais sur la page 2, je vais retrouver dans mon formulaire "Mot \\\\"
    Tu as ca dans le $_POST ou apres ?
    Parce que c'est ce que fais mysql_real_escape_string(), ajouter des \.


    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $nombre_mots = count ($mots); //compte le nombre de mots
     
    $valeur_requete = '';
    for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
    {
    $valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] ...
    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach ($mots as $value) {
    $valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $value ...
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    et pourquoi appliquer un htmlspecialchars() à ton paramètre post ?
    Tes données sont encodées dans ta base ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    la fonction htmspecialchar permet de sécuriser ma recherche.

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par mike_chti Voir le message
    la fonction htmspecialchar permet de sécuriser ma recherche.
    mysql_real_escape_string est utile pour sécuriser ta requête avant exécution par MySQL (protège par exemple des injections SQL). htmlspecialchars est utile pour sécuriser l'affichage d'une chaîne qui comprendrait des caractères html (évite des 'déformations' du site, et également les failles XSS).

    Les deux usages sont vraiment différents... Et les utiliser conjointement comme ça me semble signifier que l'on ne comprend pas leur utilité.

    D'autant que ça peut fausser ta recherche, par exemple imagines que l'on recherche une expression contenant le carcatère &...

    (mais bon, ce n'est pas ça qui est à l'origine de ton problème de doubles slashs... Quand tu dis que tu retrouves 'Mot \\' dans ton formulaire, quel est le code qui initialise ce formulaire ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    <?php
    $script_name= "recherche.php";
    $limit=2;
    mysql_connect("*****", "***", "******"); //connexion à la bdd
    mysql_select_db("***");
    $recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables impossible de faire des injonctions
    $recherche = trim($recherche);//permet de supprimer les vides avant et après le mot
    $mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
     
    if ($recherche=="") // si $recherche est vide alors $recherche vaut la valeur renvoyé par le lien GET
    { 
    $recherche = $_GET['recherche']; 
    }
    if ($mode=="")
    { 
    $mode = $_GET['mode']; 
    }
    if ($mode == "tous_les_mots")
    {
    $and_ou_or = 'AND'; //on utilisera AND dans la boucle
    }
    else
    {
    $and_ou_or = 'OR'; //on utilisera OR dans la boucle
    }
    //$mots = explode(" ", $recherche); //séparation des mots
     
     
    $mots = split(" +",$recherche);
    $nombre_mots = count ($mots); 
     
    $valeur_requete = '';
    for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
    {
    $valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
    $valeur_requete2 .= '' . $and_ou_or . ' description LIKE \'%' . $mots[$nombre_mots_boucle] . '%\'';
    $valeur_requete3 .= '' . $and_ou_or . ' content_id LIKE \'%' . $mots[$nombre_mots_boucle] . '%\'';
    }
    $valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
    $valeur_requete2 = ltrim($valeur_requete2,$and_ou_or);
    $valeur_requete3 = ltrim($valeur_requete3,$and_ou_or);
     
    $counter = mysql_query("SELECT count(*) FROM contenu
    WHERE $valeur_requete or $valeur_requete2 or $valeur_requete3
    ORDER BY content_id DESC") or die (mysql_error()); 
    $nb_total_bis=mysql_result($counter,0,"count(*)" );
     
    $nombreDePages_bis=ceil($nb_total_bis/$limit);
     
    if(isset($_GET['pages_bis'])) // Si la variable $_GET['pages'] existe...
    {
         $pageActuelle_bis=intval($_GET['pages_bis']);
     
         if($pageActuelle_bis>$nombreDePages_bis) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle_bis=$nombreDePages_bis;
         }
    }
    else 
    {
         $pageActuelle_bis=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree_bis=($pageActuelle_bis-1)*$limit; // On calcul la première entrée à lire
     
    $selection_recherche = mysql_query("SELECT * FROM contenu
    WHERE $valeur_requete or $valeur_requete2 or $valeur_requete3
    ORDER BY content_id DESC limit $premiereEntree_bis,$limit"); //requête avec le résultat de la boucle dedans
     
    $nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche
    if ($nombre_resultats == 0) //s'il n'y a pas de résultat
    {
     
    echo "Désolé, la base de données ne contient pas  <b>$recherche</b>...";
    }
    else if ($recherche=="" )     {echo "Veuillez saisir un ou plusieurs mot-clés avant de cliquer sur le bouton 'Rechercher' !";}
    else if (strlen($recherche)<2) {echo "Veuillez saisir au moins 2 caractères.";}
    // AFFICHAGE DES RESULTATS 
    else
    {  
    $texte="contenant <b>$recherche</b>";
    echo "<b>$nb_total_bis</b> r&eacute;ponse";
    if ($nb_total_bis>1) {echo "s";}
    echo " $texte";
     
    $i=0;
     
    while($i<$nombre_resultats)
        {
    	$dept_id = mysql_result($selection_recherche,$i,"dept_id");
    	$sous_type_one = mysql_result($selection_recherche,$i,"sous_type_one");
    	$content_type =mysql_result($selection_recherche,$i,"content_type");
    	$content_id = mysql_result($selection_recherche,$i,"content_id");
        $description=mysql_result($selection_recherche,$i,"description");
    	$titre=mysql_result($selection_recherche,$i,"titre");
    	for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
        {	
    	$rech[]= "#($mots[$nombre_mots_boucle])#i" ; // i permet de conserver la casse
    	}
    	$sortie ='<b>$1</b>'; 
    	echo "<br><br>";
    	$result = preg_replace($rech,$sortie,$titre);
    	echo "<font color =blue>$result</font>";
    	echo "<br>";
    	echo preg_replace($rech,$sortie,$description);
     
        echo"<br>";	
    	echo "<a href=\"companyhome.php?"
    	  . "&dept_id=$dept_id&sous_type_one=$sous_type_one&sous_type_two=$content_type&content_id=$content_id&browse_level=details&edit=false\">"
          . "voir</a>";
        $i++;
        }
    echo "<br><br>";
     
    	for($i=1; $i<=$nombreDePages_bis; $i++) //On fait notre boucle
    {
         //On va faire notre condition
         if($i==$pageActuelle_bis) //Si il s'agit de la page actuelle...
         {
             echo ' [ '.$i.' ] '; 
         }	
         else //Sinon...
         {
     
           echo "<a href='$script_name?&recherche=$recherche&mode=$mode&pages_bis=$i'>$i</a> ";
         }
    }
    }
    ?>

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je suppose que tu veux dire que les antislashs sont doublés quand tu affiches
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        $texte="contenant <b>$recherche</b>";
    ou (quand la requête ne retourne rien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        echo "Désolé, la base de données ne contient pas  <b>$recherche</b>...";
    Dans ce cas, c'est parce que tu affiches la donnée après y avoir appliqué htmlspecialchars ET mysql_real_escape_string (c'est cette dernière fonction qui échappe le caractère \).

    Comme dit dans mon précédent messages, ces deux fonctions ont des rôles bien particuliers. Pour simplifier, il faudrait que tu aies une variable $recherche_sql initialisée avec mysql_real_escape_string($_POST['recherche']) et une variable $recherche_affichage initialisée avec htmlspecialchars($_POST['recherche']), la première variable servant pour la construction de la requête SQL et la seconde pour l'affichage dans la page HTML.

    Autre chose : avec le code montré, tu sécurise les variables POST mais pas les GET... Il faudrait pour sécuriser ce code échapper les données $_GET['recherche'] et $_GET['mode'].

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    j'ai appliqué la procédure comme tu l'as décrit (merci) mais mon problème se trouve lorsque je vais cliquer sur le lien qui va me diriger vers la page 2.
    par exemple: je tape : mot \\
    lorsque je mets le pointeur de la souris sur la page 2 , je vois le lien qui dit :

    http://127.0.01/Test/recherche.php?&...ot&pages_bis=2

    du coup mon $_POST['recherche'] vaut mot \\\\

    ma variable $_GET['mode'] n'a pas besoin d'être sécurisé puisque se sont des boutons radio, à moins que je me trompe.

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Pour le lien, il faut encore échapper les carcatères différemment. Il faut utiliser la fonction urlencode ou rawurlencode (mais ni htmlentities ni mysql_real_escape_string).

    Et dans la page recherche.php, tu récupéres ces valeurs avec le tableau $_GET et non $_POST. Il faut toujours y appliquer htmlentities ou mysql_real_escape_string selon la destination de la chaîne.

    Pour le mode, si ce n'est pas nécessaire, ce n'est pas parce que ça viens d'un bouton radio mais plutôt que si ça ne vaut pas 'tous_les_mots', alors c'est l'opérateur 'OR' qui sera utilisé... Mais attention, il est tout à fait possible (et facile) d'envoyer à ta page les paramètres que l'on veut. Même si dans ton formulaire c'est un bouton radio, il est très facile d'envoyer à ta page la valeur 'un_mot_sur_deux' pour le paramètre mode. Pour ce code, ça ne pose aucun problème, mais dans d'autres cas, ça peut avoir des conséquences...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Bonjour, merci c'est ok pour l'url mais j'ai encore le problème des \.
    j'ai cru qu le problème venait de là mais pas du tout.
    comme le dit sabotage, cela est du à mysql_real_escape_string()
    qui rajoute des \.
    comment faire ?

  13. #13
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par mike_chti Voir le message
    Bonjour, merci c'est ok pour l'url mais j'ai encore le problème des \.
    j'ai cru qu le problème venait de là mais pas du tout.
    comme le dit sabotage, cela est du à mysql_real_escape_string()
    qui rajoute des \.
    comment faire ?
    Bonjour,

    Il me semble l'avoir déjà dit :
    Il faut que tu utilises :
    - mysql_real_escape_string uniquement avant ajout de ta chaîne dans une requête SQL ;
    - htmlspecialchars uniquement avant affichage de ta chaine dans une page html ;
    - urlencode uniquement avant insertion dans un lien (pour créer une URL).

    Donc faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $recherche = '';
    if (isset($_POST['recherche']))
    {
        $recherche = $_POST['recherche'];
    }
    else if (isset($_GET['recherche']))
    {
        $recherche = $_GET['recherche'];
    }
     
    $requete = 'SELECT count(*) FROM contenu WHERE titre LIKE \'%'
        . mysql_real_escape_string($recherche) . '%\''
        . 'ORDER BY content_id DESC';
     
    echo 'Résultats pour la recherche \''.htmlspecialchars($recherche).'\'';
     
    echo '<a href="recherche.php?recherche=' . urlencode($recherche). '>lien</a>';

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    j'ai appliqué donc cette marche à suivre et je n'ai plus ce problème de Slashes, Merci beaucoup.

    J'ai remarqué durant mes tests que certaines lettres pouvaient nuire à preg_replace. pour contourner le problème j'ai utilise la fonction str_replace

    avant le preg_replace, voici comment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $avant = array("\\","/","#","*","é","?","<",">","+",")","à","|","(");
    	$apres = array("//","//","//","//","e","//","//","//","//","//","a","//","//");
    	$mots=str_replace($avant,$apres,$mots);
    la fonction preg_replace me permet de mettre en gras le mot recherché.

    il me reste un petit hic, le % et le _ m'affiche tous le contenu de la table.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2008, 21h06
  2. Réponses: 1
    Dernier message: 12/12/2005, 16h11
  3. [Formulaire] intégrer des images de différents dossiers
    Par julien_t_m dans le forum Access
    Réponses: 2
    Dernier message: 16/10/2005, 20h57
  4. Réponses: 10
    Dernier message: 15/09/2005, 12h31
  5. Réponses: 4
    Dernier message: 25/11/2004, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo