Anomalie #5695
ferméErreur JS Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.moveFieldset
100%
Description
- Soit un document avec avec un attribut `con_suivi_commentaire` de type "htmltext" contenu dans un array, lui même contenu dans une frame contenue dans un tab :
id | type | frameid | ordered
-----------------------+----------+--------------+---------
proc_t_suivi | tab | | 2000
con_f_suivi | frame | proc_t_suivi | 8200
con_a_suivi | array | con_f_suivi | 8210
con_suivi_commentaire | htmltext | con_a_suivi | 8270
- L'attribut `con_suivi_commentaire` contient 3 valeurs dont une valeur avec un tag `<table>` ouvrant main non fermé :
+--- | | <p>...</p> | +--- | | <p> </p> | <p> | ... | </p> | <p> </p> | <p> | .... | </p> | <p>--</p> | <table border="0" cellpadding="0" > <!-- tag table ouvrant mais non fermé --> | <p> | ... | </p> | <p> | ... | </p> | <!-- table est non fermé ici --> +--- | | <p>...</p> | +---
Alors, lors de la consultation du document, les onglets du document ne s'affichent pas et on a l'erreur suivante dans la console JS :
Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.moveFieldset ?app=FDL&action=ALLVIEWJS&wv=3229:648(anonymous function) ?sole=Y&&app=FDL&action=FDL_CARD&unlock=Y&vid=&zone=&id=110280:1032
Le problème est que ce tag table ouvrant corrompt la structure DOM ce qui mène au fait que "topbar" se retrouve être le fils de l'élément "Fcon_f_suivi" :
<div id="documentBody" class="body" style="cursor: crosshair;">
<div id="Fcon_f_summary" class="frame">...</div>
<div id="Fcon_f_suivi" style="display: none;" name="TAGproc_t_suivi" class="frame"> <-------------------------------------.
<div class="legend" onmousedow="viewornot('Tcon_f_suivi')">Fiche de suivi</div> |
<div class="content"> |
<table width="100%" cellspacing="0" id="Tcon_f_suivi"> |
<tr class="FREEDOMBack1">...</tr> |
<tr class="FREEDOMBack1" attrid="con_a_suivi" type="array"> |
<td valign="top colspan="3" class="FREEDOMText"> |
<table style="width:100%;" class="tarray border">...</table> |
<div id="Fcon_f_delais" style="display:none;" name="TAGcon_t_delais" class="frame">...</div> |
... |
<div class="line" id="toptab"></div> <-- "toptab" ne devrait pas être sous "Fcon_f_suivi" --'
<script>moveFieldset(); showFirstFieldset()</script>
<div id="Fproc_f_synthese" style="display:none;" name="TAGcon_t_contrat" class="frame">...</div>
...
</td>
</tr>
</table>
</div>
</div>
</div>
Possible regression puisque le nettoyage des htmltext a été revu recémment.
Mis à jour par Marc Claverie il y a plus de 10 ans
- Statut changé de Nouveau à Assigné
- Assigné à mis à Jérôme Augé
- Version cible mis à 3.2.20
Mis à jour par Jérôme Augé il y a plus de 10 ans
J'ai un cas précis ou c'est `Dcp\Utils\htmlclean::xssClean()` qui corrompt le HTML.
Mis à jour par Jérôme Augé il y a plus de 10 ans
L'instruction qui corrompt le HTML original est :
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
Mis à jour par Jérôme Augé il y a plus de 10 ans
Ces trois regexp sont incorrectes car elles ne s'arrêtent pas au caractère de quote (` ou ' ou ") ouvrant utilisé, et "script" vient matcher par exemple la chaîne "Description" qui se trouve loin derrière.
Par conséquent, toute une partie du fragment HTML est effacée par cette règle incorrecte.
Mis à jour par Jérôme Augé il y a plus de 10 ans
--- WHAT/htmlclean.php.orig 2015-09-22 14:43:13.000000000 +0200
+++ WHAT/htmlclean.php 2015-09-22 14:44:45.000000000 +0200
@@ -47,9 +47,9 @@
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
- $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
- $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
- $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
+ $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?expression[\x00-\x20]*\((?:.(?!\2))*[^>]*+>#i', '$1>', $data);
+ $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?behaviour[\x00-\x20]*\((?:.(?!\2))*[^>]*+>#i', '$1>', $data);
+ $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*(?:.(?!\2))*[^>]*>#iu', '$1>', $data);
// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
Mis à jour par Éric Brison il y a plus de 10 ans
- Statut changé de Assigné à Intégré
Appliqué par commit dynacase-core|commit:1a7dca9bd982e075df02bd147d6aaaafc6e152ff.