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

JavaScript Discussion :

[Ajax] Caractères spéciaux ?


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut [Ajax] Caractères spéciaux ?
    Bonjour,

    J'utilise le principe des listes liées sur mon site. Pour cela, je vais chercher les données dans la base de données (php + génération d'un fichier json) en utilisant le dynamic script loading.

    J'utilise htmlentities avant l'envoi donc les caractères spéciaux (ç, é etc) sont convertirs en entités html (ç etc). Seulement, ils ne s'affichent pas en tant que ç mais en tant que ç par exemple.

    Comment faire ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    tu les colles en innerHTML ou en createTextNode ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Je les colle en utilisant DOM (createTextNode). Par contre, je viens de penser à quelque chose, mon fichier json est en text/javascript.

    Mes 2 fonctions :
    Page de génération du fichier json (requête en PHP, securiser::html = htmlentities(string, ENT_COMPAT, UTF-8)) :
    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
    <?php
            header("Content-type: text/javascript; charset=UTF-8");
            require('init.php');
            
            if(!empty($_GET['classe']))
            {
                    $classe = intval($_GET['classe']);
                    
                    $retour = mysql_query('SELECT id, nom FROM matieres WHERE classe_id='.$classe);
                    if(mysql_num_rows($retour) != 0 && !mysql_error())
                    {
                            $var = array();
                            while($donnees = mysql_fetch_array($retour))
                            {
                                    $var[] = array(intval($donnees["id"]), securiser::html($donnees["nom"]));
                            }
                            echo 'var oJson = '.json_encode($var).';';
                    }
                    else
                    {
                            echo 'var oJson = "";';
                    }
            }
            else
            {
                    $retour_matiere = mysql_query('SELECT id, classe_id, nom FROM matieres ORDER BY id DESC');
                    if(mysql_num_rows($retour_matiere) != 0 && !mysql_error())
                    {
                            $var = array();
                            while($donnees_matiere = mysql_fetch_array($retour_matiere))
                            {
                                    $var[] = array(intval($donnees_matiere['id']),'['.$classes[$donnees_matiere['classe_id']][2].'] '.securiser::html($donnees_matiere['nom']));
                            }
                            echo 'var oJson = '.json_encode($var).';';
                    }
                    else
                    {
                            echo 'var oJson = "";';
                    }
            }
            echo 'callback(oJson);';
    ?>
    Fonction qui gère le tout, appelée à l'ouverture de la fenetre :
    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
    function sendDSL(sUrl, oParams) 
    {
    	for(sName in oParams) 
    	{
    		if(sUrl.indexOf("?") != -1) 
    		{
    			sUrl += "&";
    		} 
    		else 
    		{
    			sUrl += "?";
    		}
    		sUrl += encodeURIComponent(sName) + "=" + encodeURIComponent(oParams[sName]);
    	}
     
    	var oScript = document.createElement("script");
    	oScript.src = sUrl;
    	oScript.type = "text/javascript";
    	document.body.appendChild(oScript);
    }
     
    function matieres()
    {
    	var liste_classe = document.getElementById('classe');
     
    	liste_classe.onchange = function()
    	{
    		var classe = liste_classe.options[liste_classe.selectedIndex].value;
    		var matiere = document.getElementById('matiere');
     
    		var a_delete = matiere.getElementsByTagName('option');
    		var nbre_elements = a_delete.length;
     
    		for(var i = a_delete.length - 1; i >= 0; i--)
    		{
    			matiere.removeChild(a_delete[i]);
    		}
     
    		var chargement = document.createElement('option');
    		matiere.appendChild(chargement);			
    		matiere.getElementsByTagName('option')[0].setAttribute('value', '');
     
    		matiere.getElementsByTagName('option')[0].appendChild(document.createTextNode('Chargement ...'));
     
    		var oParams = {"classe": classe }; 
            sendDSL("../includes/ajax_devoirs.php", oParams);
    	};
    }
    Merci

    P.S. : Comme je créé mes éléments en JS + DOM, ai-je réellement besoin d'utiliser htmlentities, y a t il des failles XSS ? car les données de la base sont mises comme texte et ne sont pas interprétées ...

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Ha ben voilà les html entities ne passent pas les textNodes ...
    essaye avec le code octal ou essaye plutot de passer par innerHTML ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Pour le innerHTML -> j'ai vu sur plusieurs articles qu'il valait mieux utiliser les éléments DOM que le innerHTML car DOM était fait pour et était standard notamment ...

    Donc :
    1 - Faut-il que je protège mes variables que je transmet en JS et que j'affiche ? C'est à dire, seront-elles interprétées (faille XSS) ou considérées comme du texte (aucun problème) ?
    2 - S'il faut protéger mes variables, comment le faire tout en affichant les accents ?

    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    regarde coté php comment convertir en code octal comme ça tu conserves le textNode ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Ok, donc j'ai 3 solutions :
    - Utiliser juste addslashes pour éviter de fermer des chaines, y a t il un risque de sécurité ?
    - Utiliser html_special_chars à la place, qui ne me convertira pas tous les accents etc
    - Utiliser une fonction perso comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function jschars($str)
    {
        $str = mb_ereg_replace("\\\\", "\\\\", $str);
        $str = mb_ereg_replace("\"", "\\\"", $str);
        $str = mb_ereg_replace("'", "\\'", $str);
        $str = mb_ereg_replace("\r\n", "\\n", $str);
        $str = mb_ereg_replace("\r", "\\n", $str);
        $str = mb_ereg_replace("\n", "\\n", $str);
        $str = mb_ereg_replace("\t", "\\t", $str);
        $str = mb_ereg_replace("<", "\\x3C", $str); // for inclusion in HTML
        $str = mb_ereg_replace(">", "\\x3E", $str);
        return $str;
    }
    Quel est le mieux ? merci

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    je vote pour la fonction perso ^^
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Ok donc si j'utilise cette fonction jschars perso avant de transmettre les données via DSL + json, je ne risque pas de faire apparaitre des failles XSS ?

    Si c'est bien ça, alors, le sujet est résolu.

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    En fait en y reflechissant un peu plus ...
    htmlentities est conçu pour ne pas que le code html s'execute au moment de son interprétation sur la page ...
    le fait de faire des createTextNode epêche déja l'interprétation du code mise dans le textNode, puisque tu dis au DOM qu'en c'est un noeud de texte donc à mon avis même pas besoin de htmlentites. Il se justifierait si tu l'insérais en inneHTML ou là le code pourrait être interprété
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  11. #11
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    Ok donc addslashes pour éviter que la scène soit tronquée par un guillemet précoce. Sujet résolu.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] affichage caractères spéciaux ajax.
    Par vacknov dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/08/2007, 07h25
  2. [AJAX] Caractère spéciaux php/ajax.
    Par Empty_body dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/07/2007, 10h01
  3. Réponses: 1
    Dernier message: 22/01/2007, 20h33
  4. [PHP-JS] caractère spéciaux Ajax
    Par romano2003 dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2006, 18h25
  5. [AJAX] Ajax et les caractères spéciaux
    Par Moloc'h dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/01/2006, 14h02

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