[Résolu][XHTML/Javascript/W3C] Problème de XHTML dans un Javascript

Problème de XHTML dans un Javascript [Résolu][XHTML/Javascript/W3C] - HTML/CSS - Programmation

Marsh Posté le 21-10-2006 à 18:42:34    

Bonjour,  
 
j'ai un petit problème, je construis un site (jeu)et il a toujours été valide W3C pour l'instant (XHTML 1.1)
 
Mais je commence à utiliser un script en javascript avec une fonction avec un argument "textuel" (la fonction va en fait afficher un DIV au millieu de l'écran et mettre le texte inclu dans l'argument dans le Div)
 
Bref le problème n'est pas là, mais juste que W3C refuse d'afficher ceci :  

Code :
  1. <script type="text/javascript">
  2. pop("Choisissez l\'arme pour équiper votre troupe : <br />", "200", "300", "" );
  3. </script>


 
Erreur : impossible de mettre un <br /> dans cet endroit. (ce script est dans un div, dans le body)
 
Erreur :  

Citation :

Error  Line 52 column 57: document type does not allow element "br" here.
 
pop("Choisissez l\'arme pour équiper votre troupe : <br />", "200", "300", "" );
 
The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head" -- or two elements that overlap (which is not allowed).
 
One common cause for this error is the use of XHTML syntax in HTML documents. Due to HTML's rules of implicitly closed elements, this error can create cascading effects. For instance, using XHTML's "self-closing" tags for "meta" and "link" in the "head" section of a HTML document may cause the parser to infer the end of the "head" section and the beginning of the "body" section (where "link" and "meta" are not allowed; hence the reported error).
 


 
Merci de m'aider !

Message cité 2 fois
Message édité par tizard le 21-10-2006 à 20:28:04
Reply

Marsh Posté le 21-10-2006 à 18:42:34   

Reply

Marsh Posté le 21-10-2006 à 18:44:11    

tizard a écrit :

Bonjour,  
 
j'ai un petit problème, je construis un site (jeu)et il a toujours été valide W3C pour l'instant (XHTML 1.1)


Dzzzzt erreur ! L'XHTML 1.1 n'est pas géré par IE, et doit être envoyé aux agent-utilisateurs avec le type mime application/xhtml+xml. Veuillez recommencer en Xhtml 1.0

Reply

Marsh Posté le 21-10-2006 à 18:44:58    

tizard a écrit :

Code :
  1. <script type="text/javascript">
  2. pop("Choisissez l\'arme pour équiper votre troupe : <br />", "200", "300", "" );
  3. </script>



Bienvenue dans le bordel de l'XHTML, le vrai. Conseil : ne met jamais de script comme ça dans le code XHTML direct, externalise les tous dans un fichier à part

Reply

Marsh Posté le 21-10-2006 à 18:48:54    

Je met au passage un message pour déconseiller les utilisateurs de IE < 7 à ce site ^^ mais le problème n'est pas à ça...
 
C'est impossible même d'appeler une fonction avec un argument XHTML ?
Enfin les externaliser good, mais faut bien les appeler ! et pour les appeler, il faut bien faire un script comme ça, non ?

Reply

Marsh Posté le 21-10-2006 à 18:53:28    

Ben non, pas obligé, t'as juste à remplacer ton truc par :

Code :
  1. <script type="text/javascript" src="pouet.js"></script>


Et faire un fichier pouet.js avec dedans :

Code :
  1. pop("Choisissez l\'arme pour équiper votre troupe : <br />", "200", "300", "" );


Et voilà

Reply

Marsh Posté le 21-10-2006 à 18:55:22    

truc bien lourd quoi lol... ^^
et les messages où il n'y a pas de xhtml dedans je peux les mettre direct, ça posera pas trop de problème ?

Reply

Marsh Posté le 21-10-2006 à 18:55:59    

Ouais, mais comme dit, pas top. En plus si c'est externalisé, c'est mis en cache par les navigateurs, donc moins de charge pour ton serveur...

Reply

Marsh Posté le 21-10-2006 à 18:57:29    

ça veut dire que je suis partit pour créer 15 000 fichiers ::D
 
Bon merci beaucoup de ton aide ultra-rapide ;)
 
++

Reply

Marsh Posté le 21-10-2006 à 20:27:29    

Bon alors, j'aime bien finir ce que je fais, donc je poste ici la solution que j'ai prise :)
 
Je ne pouvais pas créer 12 000 fichiers, puisque les messages à mettre sont dynamiques et peuvent donc changer en fonction du message que je veux mettre :p
 
Donc j'ai presque suivi ta solution, sauf que j'ai fait un  
echo '<script type="text/javascript" src="func.php?message='.urlencode($message).'"></script>';
 
La page func.php fait un urldecode sur ce message et exécute le script
(bien sûr func.php => header("Content-Type: text/javascript" ); en premier lieu)
 
Voilà bon c'était juste pour conclure :p

Reply

Marsh Posté le 22-10-2006 à 10:47:35    

Pourrait-tu poster le contenu de func.php ? Histoire de vérifier un truc

Reply

Marsh Posté le 22-10-2006 à 10:47:35   

Reply

Marsh Posté le 22-10-2006 à 14:09:23    

FlorentG a écrit :

Pourrait-tu poster le contenu de func.php ? Histoire de vérifier un truc


 
Ok alors je commence par la fonction PHP loadpopup donc je me sert en premier lieu :

Code :
  1. function loadpopup($msg, $height = 100, $width = 200)
  2. {
  3. $mesg = addslashes($msg);
  4. $browser = get_browser(null, true);
  5. if($browser["browser"] == 'IE' && $browser["majorver"] < 7) $ie = 1;
  6. echo '<script type="text/javascript" src="inc/lpop.php?msg='.urlencode($msg).'&amp;height='.$height.'&amp;width='.$width.'&amp;ie='.$ie.'">
  7. </script>';
  8. }


 
lpop.php:

Code :
  1. <?php
  2. header("Content-Type: text/javascript" );
  3. require_once('pop.js');
  4. $mesg = addslashes(urldecode($_GET['msg']));
  5. echo 'var mesg = "'.$mesg.'";';
  6. echo 'var height = "'.$_GET['height'].'";';
  7. echo 'var width = "'.$_GET['width'].'";';
  8. echo 'var ie = "'.$_GET['ie'].'";';
  9. ?>
  10. pop(mesg, width, height, ie);


 
pop.js

Code :
  1. function opac(ie)
  2. {
  3. var divns6 = document.getElementsByTagName("div" );
  4. if(ie!=1)
  5. {
  6. divns6['A'].style.visibility = "visible";
  7. }
  8. divns6['B'].style.visibility = "visible";
  9. }
  10. function desopac(ie)
  11. {
  12. var divns6 = document.getElementsByTagName("div" );
  13. if(ie!=1)
  14. {
  15. divns6['A'].style.visibility = "hidden";
  16. }
  17. divns6['B'].style.visibility = "hidden";
  18. }
  19. function pop(mesg, width, height, ie){
  20. var msg = "<p style='margin: 0;'><a href='#' onclick='javascript:desopac();'><img src = 'images/croix.jpg' style='border:0;float: right;' alt='close'/></a><br />";
  21. var mesg2 = msg+mesg+"</p>";
  22. var divns6 = document.getElementsByTagName("div" );
  23. divns6["B"].style.width = width+"px";
  24. divns6["B"].style.height = height+"px";
  25. divns6["B"].innerHTML = mesg2;
  26. opac(ie)
  27. }


 
(et dans le body il faut que je mette  

Code :
  1. <div id="A"></div>
  2. <div id="B"></div>


 
(je met le CSS approprié pour les interessé ^^)

Code :
  1. #A
  2. {
  3. top:0;
  4. left:0;
  5. width:100%;
  6. height:100%;
  7. visibility: hidden;
  8. margin: 0;
  9. padding: 0;
  10. position:absolute;
  11. background-color:#BBBBBB;
  12. opacity: 0.5;
  13. filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);
  14. }
  15. #B
  16. {
  17. visibility : hidden;
  18. margin: auto;
  19. position: absolute;
  20. width: 200px;
  21. height: 50px;
  22. left: 40%;
  23. top: 40%;
  24. border: 1px black solid;
  25. background-color: #44BB22;
  26. text-align: center;
  27. padding: 1px;
  28. }


 
Donc voilà cette fonction met un foreground gris à 50% d'opacité mais caché au début, lorsqu'on lance la fonction cela affiche le foreground et modifie le div central (qui était caché aussi) pour écrire ce que l'on veut dedans. Notez que j'ai désactivé la fonction du foreground si IE < 7 car ça déconne (ça n'est pas une question de transparence, mais que le foreground ne s'affiche bizarrement qu'en haut à gauche de l'écran, un tout petit rectangle...)
 
Voili :p


Message édité par tizard le 22-10-2006 à 14:14:22
Reply

Marsh Posté le 22-10-2006 à 14:19:08    

Ok, donc y'a un possible problème de sécurité qui permetterait d'injecter du JS arbitraire, et par exemple de récupérer les cookies du domaine -> Faille de type XSS (cross site scripting)
 
T'as presque fait ce qu'il fallait, t'as mis un addslashes sur $_GET['msg']. Mais tu dois aussi le faire sur les autres : height, width et ie.

Reply

Marsh Posté le 22-10-2006 à 14:43:51    

Ok je le fais, merci :) (cela dit personne ne connait l'existance du fichier lpop... je pourrais autant le mettre en .inc ce qui limiterait tout, non ?)


Message édité par tizard le 22-10-2006 à 14:46:29
Reply

Marsh Posté le 22-10-2006 à 15:12:32    

On connait pas l'existence du fichier, mais on peut facilement voir que le fichier contient des données passées en paramètres, donc modifiable. Deux-trois test, et hop !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed