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 :

alerte unsafe-eval pour txt.substring


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut alerte unsafe-eval pour txt.substring
    Bonjour,

    J'ai trouvé ce petit script pour compter les caractères dans un textarea et limiter la longueur du texte saisi.

    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
    window.onload = function() {
      setTimeout('timer()', 100);
    };
     
    function compter(f) {
      var max = 1200;
      var txt = f.com.value;
      var nb = txt.length;
      if (nb > max) {
        alert("Pas plus de " + max + " caractères dans ce champ");
        f.com.value = txt.substring(0, max);
        nb = max;
      }
      f.nbcar.value = nb;
    }
     
    function timer() {
      compter(document.forms[0]);
      setTimeout("timer()", 100);
    }

    Cela semble provoquer une alerte unsafe-eval par le CSP (Content Security Policy)/

    Où voyez-vous la faille de sécurité ?

    Merci d'avance.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 233
    Par défaut
    Bonjour,
    assurément tu n'as pas trouvé ce qui se fait de plus simple et de moins gourmand.

    Avec comme HTML :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <textarea id="commentaire" name="commentaire" value=""></textarea>
    une fois le DOM chargé, il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const domElement = document.getElementById("saisie");
    const maxCar = 1200;
    domElement.addEventListener("keydown", function(e) {
      console.log(this.value.length);
      if (this.value.length > maxCar) {
        // ton code
      }
    });
    et encore plus simple sans JavaScript :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <textarea id="commentaire" name="commentaire" value="" maxlength="1200"></textarea>

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bonjour,

    Ton double setTimeout est également très gênant pour le fonctionnement de la page...

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Et si tu veux du temps réel même en cas de copier / couper / coller...

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <div id="count"></div>
    <textarea id="t" rows="10" cols="100" maxlength="1200"></textarea>

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("t").addEventListener("input",(e)=> document.getElementById("count").textContent=e.target.value.length)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour NoSmoking et javatwister,

    Merci de votre suivi, je vais faire les tests pendant le week-end.

    Je vais commencer par le code de javatwister qui me semble le plus simple.

    A voir le comportement du navigateur avec simplement maxlength="1200" quand tu dépasses les 1200 caractères.
    Cela bloque la saisie, mais avec ou sans alerte (à mon avis sans) ?
    C'est quand même plus sympa d'avoir une alerte, d'où le code de NoSmoking.

    Je vous tiens informé.

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bah, si t'as une alerte qui te casse ta page, ce sera moche...

    Tu peux ajouter cette condition:

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const t=document.getElementById("t"),
    count=document.getElementById("count");
     
    t.addEventListener("input",(e)=> 
    	e.target.value.length<e.target.maxLength ? 
    	count.textContent=e.target.value.length:
    	count.textContent="Limite atteinte!!!"
    )

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour,

    J'ai essayé le code de javatwister qui fonctionne bien.

    Par contre j'aimerais que le compteur de signes soit activé dès le chargement de la page, comme c'est le cas avec le script un peu pourri actuel.

    Le textarea peut être un brouillon en mémoire que le client veut modifier, c'est donc bien de voir le nombre de signes dès le chargement de la page.

    Je vais y réfléchir mais si la réponse est pour vous évidente je vous remercie une fois de plus par avance.

  8. #8
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Code html : 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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    	<meta charset="utf-8"/>
    	<title>...</title>
    <style>
    </style>
    </head>
    <body>
     
    <div id="count"></div>
    <textarea id="t" rows="10" cols="100" maxlength="1200">zone déjà entamée</textarea>
     
     
    <script>
    document.addEventListener("DOMContentLoaded",()=>{
            const t=document.getElementById("t"),
            count=document.getElementById("count");
     
            t.addEventListener("input",(e)=> num());
     
            const num=()=> 
                    count.textContent=t.value.length<t.maxLength ? 
                    t.value.length:
                    "Limite atteinte!!!"
     
            num()
    })
    </script>
     
    </body>
    </html>

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour javatwister,

    Encore MERCI pour ton suivi.

    Je teste dans l'après-midi.

    Je vous tiens informés.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour Javatwister,

    J'ai testé ton code en réel avec de petits changements pour mon contexte, cela fonctionne très bien.

    Seul petit bémol IE9 ne le comprend pas alors que le code pourri d'origine ne lui pose aucun problème.

    J'ai essayé de remplacer textContent or innerText ou innerHTML mais cela ne marche pas mieux.

    Pire les scripts qui suivent ne sont plus compris par IE qui donc détecte une erreur de syntaxe fatale dans ton script.

    As-tu une idée pour plaire à IE ?

    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
    document.addEventListener("DOMContentLoaded", () => {
    const comment=document.getElementById("comment"),
    count=document.getElementById("tpt");
     
    comment.addEventListener("input", (e)=> num());
     
    const num=()=>
    {
    const max = 1200;
    count.textContent = comment.value.length;
    if (comment.value.length > max) alert ('Pas plus de ' + max + ' caractères dans le champ Commentaires');
    }
     
    num();
    });

  11. #11
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    IE ne comprend pas les fonctions fléchées;

    Attention, ne redéfinis pas max à chaque événement dans la zone de texte!

    Par ailleurs, maxlength est une propriété très performante qui n'a pas besoin d'une variable en roue de secours...

    Peu importe, tu peux faire ça:

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    document.addEventListener("DOMContentLoaded",function(){
    	const comment=document.getElementById("comment"),
    	count=document.getElementById("tpt"),
    	max=1200;
     
    	comment.addEventListener("input",function(){num()});
     
    	const num=function(){
    		count.textContent=comment.value.length;
    		if(comment.value.length==max) alert("Pas plus de " + max + " caractères dans le champ Commentaires.");
    	}
     
    	num()
    })

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Merci encore pour le suivi.

    C'est volontairement que je n'utilise par maxlength, je n'ai pas mis de maxlength dans le textarea, le contrôle se fait par PHP côté serveur.

    A ce propos, pour que le compte par PHP soit identique au compte par javascript, il y a un petit détail côté PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_strlen (str_replace ("\r\n", "\r", stripslashes ($com))
    Si tu ne fais pas cela PHP compte un retour chariot pour 2 caractères alors que javascript en compte 1 seul.

    Bon je teste ton code dans quelques minutes.

    Je te tiens informé.

  13. #13
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Citation Envoyé par boteha Voir le message
    je n'ai pas mis de maxlength dans le textarea, le contrôle se fait par PHP côté serveur
    Ajoute un maxlength! ça garantit que le client n'écrira plus rien après 1200 caractères, c'est quand même intéressant;

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Javatwister,

    La nouvelle version de ton code fonctionne parfaitement avec IE et bien sûr Edge, Firefox et Chome.

    Grand merci, j'attends un peu avant de cocher Résolu.

    Citation Envoyé par javatwister Voir le message
    Ajoute un maxlength! ça garantit que le client n'écrira plus rien après 1200 caractères, c'est quand même intéressant;
    Si je mets un maxlength et que le client colle un texte de 2000 signes il ne verra que les 1200 premiers signes.

    Sans maxlength et avec une alerte javascript, il se prend une alerte très claire à faire disparaitre en un clic.

    Il accède ensuite à tout son texte et peut le couper au milieu s'il veut garder la fin qui aurait disparu avec maxlength.

    Et s'il valide un texte trop long c'est bloqué par PHP qui lui demande de raccourcir.

    Je trouve cela idéal.

  15. #15
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Citation Envoyé par boteha Voir le message
    Et s'il valide un texte trop long c'est bloqué par PHP qui lui demande de raccourcir.
    Encore une fois, je trouve que c'est une perte d'énergie;

    En tout cas, si tu fais comme tu as dit, n'oublie pas de remettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (comment.value.length > max)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    J'ai remis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (comment.value.length > 1200) alert ('Pas plus de 1 200 caractères dans le champ Commentaires');
    Plus besoin de déclarer max en production car la valeur de 1200 est une constante, cela fait une variable en moins.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour,

    Je confirme que le sujet est résolu.

    Le code de javatwister fonctionne sur les principaux navigateurs (dont IE) et ne provoque pas d'alerte unsafe-eval.

    Encore MERCI.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/04/2009, 15h04
  2. utilisation d'eval pour une fonction générique
    Par DrDam dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2008, 13h22
  3. Alert du javascript pour un boutton coté serveur (c#)
    Par tina25 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 03/12/2007, 17h52
  4. Réponses: 2
    Dernier message: 03/10/2006, 22h20
  5. pb eval pour le code php dans une feuille xslt
    Par nipepsi dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 10/09/2004, 12h23

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