web-dev-qa-db-fra.com

Comment échapper à une esperluette dans une chaîne javascript pour que la page soit validée strictement?

J'essaie de passer un dataString à un appel ajax en utilisant JQuery. Dans l'appel, je construis les paramètres get, puis je les envoie à la page php à la réception. Le problème est que la chaîne de données contient des esperluettes et que le validateur HTML strict est en train de l'étouffer.

Voici le code:

$(document).ready(function(){
    $("input#email").focus();
    $('#login_submit').submit(function(){
        var username = $('input#email').val();
        var password = $('input#password').val();
        var remember = $('input#remember').attr("checked");
        var dataString = "email="+username+"&password="+password+"&remember="+remember;
        $.post('login.php', dataString, function(data) {
            if (data == 'Login Succeeded.') {
                location.reload(true);
            } else {
                $("input#email").focus();
                $("#login_msg").html(data).effect("pulsate", {times: 2}, 1000); 
            }
        });         
        return false;
    });
});

et voici un exemple du message du validateur: impossible de générer l'identifiant système pour l'entité générale "mot de passe".

var dataString = "email="+username+"&password="+password+"&remember="+rememb…

(dans le validateur le "p" après la première esperluette est marqué en rouge indiquant le point de l'échec).

30
Mike Farmer

Essayez de mettre votre javascript dans un bloc CDATA comme ceci:

<script type="text/javascript">
<![CDATA[
// content of your Javascript goes here
]]>
</script> 

ce qui devrait lui faire passer la validation. Pour plus de sécurité, vous pouvez ajouter des commentaires Javascript autour des balises CDATA pour les masquer aux navigateurs plus anciens qui ne comprennent pas la balise CDATA:

<script type="text/javascript">
/* <![CDATA[ */
// content of your Javascript goes here
/* ]]> */
</script> 
35
Marc Novakowski

"\ u0026" fonctionne!

23
Jeff

Remarque: avant de passer aveuglément du texte dans des blocs CDATA, sachez que le but de CDATA est [~ # ~] pas [~ # ~] pour rendre invalide caractères valides.

Voir: http://www.flightlab.com/~joe/sgml/cdata.html

6
BryanH

Parfois, \u0026, &#38, %26, &amp, ou <![CDATA[ ... ]]> fonctionne pour les esperluettes dans les blocs de script en xhtml.
Je voudrais demander pourquoi nous devrions vouloir ce type de restriction (loyauté aux erreurs de conception de SGML) qui empêche également &nbsp, mathml, target et nested xml ne fonctionnent pas.
Pourquoi ne pouvons-nous pas simplement dire que dans un bloc de script aucune balise ou autre élément SGML n'est reconnu? Pourquoi le xhtml ne permet-il pas aux cibles de fonctionner?
Je ne vois aucun avantage pour SGML qui l'emporte sur les inconvénients. À l'heure actuelle, même si html5 est quelque peu disponible, xhtml est le validateur qui détecte le plus d'erreurs de développeur. Corrigeons xml sans égard historique à ses origines.

0
Dana WIlson