Ze problaim
Si tu publies des bouts de code sur pluXML, tu as sans doute remarqué que ce dernier est pour le moins psychorigide avec les antislashes: il les vire sans ménagement... pourtant, on aimerait bien qu'il conserve les regex en l'état dans un code par exemple.
Je suis pas stupide, je comprends bien qu'il s'agit là d'un souci de sécurité, mais quand même, ça fait ch***.
Le souci,c'est que pluXML filtre les antislashes dans les $_POST
très très tôt dans le code, bien avant tout hook de plugin: il le fait dans le prepend.php de l'admin, ligne 43.
Ben mon con, comment tu vas faire si tu peux pas intervenir en php via un hook pour modifier le $_POST
?
Ze solouchonne
Ben tu le modifies en JS dans la page article lors du submit du formulaire
En gros, on remplace les «\» par des «\» dans le chapo et le avant de submit le formulaire. C'est une méthode dont j'ai trouvé l'idée ici https://forum.pluxml.org/discussion/6960/plugin-plx-cssbackslash-pour-ledition-des-fichiers-css
Donc, j'injecte un petit script JS via le hook AdminArticleFoot et il se charge d'intervenir lorsque le navigateur a terminé de créer l'objet formData: c'est d'ailleurs cet évènement qu'on va utiliser dans addEventListener au lieu du submit habituel.
Code du script injecté
(function (){
let chapo = document.getElementById("id_chapo");
var content = document.getElementById("id_content");
var form = document.getElementById("form_article");
function saveSlashes(str){
return str.replace(/[\\]/g, '\\$&');
}
form.addEventListener('formdata',function(e){
let formData = e.formData;
formData.set('chapo', saveSlashes(formData.get('chapo')));
formData.set('content', saveSlashes(formData.get('content')));
});
})();
Ze saiquiouriti ?
Niveau sécurité, le plugin n'intervient que sur la page article.php et uniquement sur les champs chapo et content du formulaire. Il ne bloque pas le plxUtils::unSlash($_POST)
du prepend.php. Je pense donc qu'il n'ouvre pas de faille majeure.
Ze conclugionne
Ainsi, les antislashes de ce script tiré de l'article sur le bug de mpdération passent enfin sans problème :
Exemple de code problématique
const PATTERNS = array(
'arts' => '#^\D?(\d{4,})\.(?:\w+|\d{3})(?:,\w+|,\d{3})*\.\d{3}\.\d{12}\..*\.xml$#',
'statiques' => '#^(\d{3,})\..*\.php$#',
'commentaires' => '#^_?\d{4,}\.(?:\d{10,})(?:-\d+)?\.xml$#'
);
Le zip est à télécharger depuis mon repo : https://repo.warriordudimanche.net/ZIPFILES/ArticleBackslashesKeeper.zip
(...)