#11 Remplir le validateur `css`

Open
opened 4 months ago by Darks · 4 comments
Darks commented 4 months ago

Pas évident, il s’agit de vérifier si le texte entré est du CSS valide et sain : il faut pouvoir éviter les injection de code ou d’images malveillantes.

Ça requiert un peu de théorie des langages je pense, enfin, à voir. Ou alors on part sur une whitelist à base de regex. Mais faut pas que ça soit trop souple non plus.

À voir, mais ça s’annonce pas super évident. Après c’est utilisé que par les admins donc la portée reste raisonnable, mais faire cette fonction propre permettra d’éviter les dégâts collatéraux en cas de compromission d’un compte administrateur.

Pas évident, il s'agit de vérifier si le texte entré est du CSS valide et sain : il faut pouvoir éviter les injection de code ou d'images malveillantes. Ça requiert un peu de théorie des langages je pense, enfin, à voir. Ou alors on part sur une whitelist à base de regex. Mais faut pas que ça soit trop souple non plus. À voir, mais ça s'annonce pas super évident. Après c'est utilisé que par les admins donc la portée reste raisonnable, mais faire cette fonction propre permettra d'éviter les dégâts collatéraux en cas de compromission d'un compte administrateur.
Darks added the
enhancement
label 4 months ago
Darks added the
help wanted
label 4 months ago
Eragon commented 4 months ago
Collaborator

Le css, dans quel partie ?

Le css, dans quel partie ?
Darks commented 4 months ago
Owner

C’est un validateur, donc /app/utils/validators.py :) Actuellement sur la branche trophies

C'est un validateur, donc `/app/utils/validators.py` :) Actuellement sur la branche `trophies`
Lephenixnoir commented 4 months ago
Owner

Il y a une autre possibilité qui consiste à sécuriser le contexte pour qu’aucune injection ne soit possible. Par exemple, on pourrait générer un fichier CSS avec une classe par élément. Tant que le code CSS de chaque élément ne contient pas d’accolade, je ne pense pas qu’il puisse y avoir une injection.

Pour le reste, on peut également faire un coup de regex, ce n’est pas très dur. Il faut juste être un peu large sur les caractères autorisés dans les valeurs de propriétés.

Il y a une autre possibilité qui consiste à sécuriser le contexte pour qu'aucune injection ne soit possible. Par exemple, on pourrait générer un fichier CSS avec une classe par élément. Tant que le code CSS de chaque élément ne contient pas d'accolade, je ne pense pas qu'il puisse y avoir une injection. Pour le reste, on peut également faire un coup de regex, ce n'est pas très dur. Il faut juste être un peu large sur les caractères autorisés dans les valeurs de propriétés.
Lephenixnoir commented 2 months ago
Owner

Une première approche pourrait être de restreindre les noms des propriétés à [a-zA-Z-]+ et les valeurs à [^;{}]+. Je vois pas trop ce qui pourrait mal se passer avec ça puisqu’il n’y a pas moyen de tricher en ajoutant des règles.

La regex serait du genre \s*(?:<prop>;\s*)*<prop>;?\s*<prop> serait substitué par [a-zA-Z-]+\s*:\s*[^;{}]+.

Une première approche pourrait être de restreindre les noms des propriétés à `[a-zA-Z-]+` et les valeurs à `[^;{}]+`. Je vois pas trop ce qui pourrait mal se passer avec ça puisqu'il n'y a pas moyen de tricher en ajoutant des règles. La regex serait du genre `\s*(?:<prop>;\s*)*<prop>;?\s*` où `<prop>` serait substitué par `[a-zA-Z-]+\s*:\s*[^;{}]+`.
Sign in to join this conversation.
No Milestone
No Assignees
3 Participants
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
Cancel
Save
There is no content yet.