Sécurisation des squelettes SPIP HTML

Demande envoyée à la spip_team :

La nouvelle release apporte le filtre attribut_url et ça semble un fix de sécurité. La doc de attribut_url a été préparée et publiée : |attribut_url - SPIP mais elle ne me semble pas suffire en elle même car attribut_url n’est que producteur de « sécurité », pas « productive de fonctionnalité utilisateur », et il me semble que c’est un tournant.
C’est à dire que dans spip, jusqu’à présent, la sécurité était l’apanage de la spip-team, et le seul besoin des spipeurs et rédacteurs de squelettes SPIP-HTML était de mettre à jour leur site avec les dernières versions fournies : on ne leur a jamais demandé de penser, anticiper et coder la sécurité.

Or ce fix et ce filtre témoignent d’un risque même pour de simples codeurs SPIP HTML. Ça mérite une attention particulière. Et s’il y a d’autres telles circonstances, elles méritent un article global sur la sécurisation du dev d’un site SPIP.

En pratique, il serait également utile d’aider les sites existant à se sécuriser :

  • préciser quelles situations requièrent ce code,
  • comment repérer les bouts de code à changer. Comment faire une recherche dans le code au moyen de quelques regexp assurant un pré-tri ? .

attribut_html est-il nécessaire pour TOUS les usages d’une balise ou d’un calcul donnant une url utilisée en valeur d’attribut url ?

Par exemple, une des modifs apportées dans la dist est l’application de |attribut_url sur

#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}

Les arguments étant a priori inoffensifs ici, est-ce un excès de précaution zélée ?
Ou bien un #URL_ECRIRE aux arguments peinards peut il réellement nécessiter protection ???

Réponse reçue de @cerdic :

Hello Jean-Luc, Je pense pas que cette question ait sa place sur cette liste, qui était réservée au signalement des failles de sécu et pas au support. Je te réponds quand même mais tu vois c’est bien dommage car tu es le seul à bénéficier de la réponse au lieu d’avoir ça dans une discussion publique…

Voilà, c’est corrigé et accessible à tous

L’utilisation de attribut_url relève de la même pratique que attribut_html : si on insère du contenu dans un attribut d’une balise, sans aucune protection, alors toute valeur un peu exotique qui contient des guillemets peut casser le HTML, et cela peut-être utilisé pour injecter des XSS par exemple.

Jusqu’ici les URLs n’étaient en général pas protégée car les cas où cela peut se produire sont assez tordus et le filtre attribut_html est trop invasif pour être utilisé sur une URL. C’est donc le but du nouveau filtre attribut_url.

La protection de certaines balises peut paraître superflue, mais une bonne pratique que l’on applique par ci par là sans trop savoir et selon sa bonne humeur, ça marche jamais bien.

Il est donc en effet fortement recommandé d’utiliser les 2 filtres attribut_url et attribut_html sur tout contenu produit par une balise (ou chaine de langue) que l’on insère dans un attribut d’une balise.

Et par ailleurs je ne suis pas d’accord avec ton préambule que la sécurité relevait jusqu’ici du core uniquement.

Les personnes qui écrivent des squelettes ont tout le pouvoir d’ouvrir des trous de sécus en voici en voilà depuis toujours,

  • par exemple en ne protégeant pas les contenus des attributs des balises,
  • en utilisant des ** sur des #ENV,
  • en mettant du PHP dans leurs squelettes (9 fois sur 10 ou je trouve du PHP dans un squelette il y a un trou de sécu avec…).

Bref, rien de très nouveau sous le soleil, même si un guide des bonnes pratiques pourrait en effet avoir son utilité.

5 « J'aime »

C’est donc aussi pertinent pour les chaînes de langue renvoyant une url utilisée en attribut HTML. Ajouté à la doc mais j’utilise pas les chaines de langue alors qqn d’autre pourrait donner un exemple…

Remarque : on aurait peut-être pu en causer dans documentation - Discuter de SPIP pour une rédaction et relecture collective avant de diffuser ici.

1 « J'aime »

Le sujet est très intéressant, c’est une bonne idée d’en faire un guide des bonnes pratiques !
Ping @documentation

1 « J'aime »

N’hésite pas à le faire si tu en ressens le besoin.