Aller au contenu

Assainir

phil/css-sanitizer

Feuilles de style et attributs style

CssSanitizer::sanitize() lit une feuille de style : le contenu d'un élément <style> ou d'un fichier .css. Ses règles sont des règles de style et des règles @.

CssSanitizer::sanitizeDeclarations() lit les déclarations d'un attribut style, sans accolades. Les règles @ qui s'y trouvent sont retirées.

$sheet = $sanitizer->sanitize('h1 { color: red; position: fixed }');
$sheet->css;        // "h1 {\n  color: red;\n}\n"

$inline = $sanitizer->sanitizeDeclarations('color: red; position: fixed');
$inline->css;       // 'color: red'

Les deux renvoient un Sanitized. Aucune ne lève d'exception sur ce qu'elle lit : tout ce que la politique ne permet pas est retiré et listé.

Le résultat

MembreCe qu'il contient
cssLe CSS à écrire dans la page : deux espaces d'indentation par niveau pour une feuille de style, name: value; … pour des déclarations
removalsLes Removal, dans l'ordre de la source, jusqu'à Sanitized::MAX_REMOVALS (100)
omittedRemovalsLes retraits au-delà des 100 premiers, comptés mais non listés
isClean()Indique si rien n'a été retiré
sheetLes règles gardées d'une feuille de style : Sheet\StyleSheet de Sheet\ImportRule, de Sheet\StyleRule et de Sheet\GroupRule
declarationsLes Syntax\Declaration gardées d'un attribut style

Une règle restée sans déclarations est écartée sans retrait propre : ses déclarations ont déjà été listées. Il en va de même d'une règle de groupe restée vide.

Les retraits

Une source d'un mégaoctet peut contenir des centaines de milliers de règles refusées : les 100 premiers retraits sont listés, et omittedRemovals compte les autres, pour que ni le résultat ni un formulaire qui l'affiche ne grossissent avec eux.

Chaque Removal a une reason, un subject et une line. Le sujet est le nom de la propriété, le sélecteur, @import, le nom de la fonction avec () ou l'URL, coupé à 80 points de code. La ligne est celle de la source où il commence.

RemovalReasonCe qui est retiré
ImportUne règle @import que la politique ne permet pas, ou qui n'ouvre pas la feuille de style
AtRuleUne règle @ que la politique ne permet pas, ou qui ne peut pas se trouver là (autre que @media et @supports dans une règle de style, dans une boîte de marge)
PreludeLa règle @ entière dont la requête média, la condition ou le sélecteur de page n'est pas permis
SelectorUn sélecteur d'une liste ; la règle garde les autres
PropertyUne déclaration dont la politique ne permet pas la propriété, ou une propriété personnalisée quand elles ne sont pas permises
DeniedPropertyUne déclaration de behavior, -ms-behavior ou -moz-binding, toujours
FunctionUne déclaration qui contient une fonction que la politique ne permet pas
UrlUne déclaration qui contient une URL refusée par le réécrivain ; dans @font-face, cette source seulement ; une règle @import
DangerousUrlUne déclaration qui contient une URL javascript:, vbscript:, livescript: ou mocha:
ValueUne déclaration dont la valeur contient un jeton qu'aucune valeur permise ne contient, ou qui est vide
ImportantL'indicateur !important d'une déclaration, quand la politique ne le garde pas ; la déclaration reste
SyntaxCe que CSS écarte lui-même : une déclaration sans deux-points, du texte qui n'est ni une déclaration ni une règle @, une règle coupée avant son bloc, une règle @ sans le bloc qu'il lui faut
FontSourceUne source @font-face d'une forme inutilisable ; une règle @font-face restée sans famille ou sans source
TooLongLa source entière, plus longue que la limite de la politique
TooDeepLa source entière, dont les blocs et les fonctions s'imbriquent plus profondément que la limite de la politique
NestingUne règle imbriquée dans une règle de style au-delà des niveaux d'imbrication de la politique, avec ce qu'elle contient

RemovalReason::describe() donne quelques mots pour un message : an @import rule, a property that runs code.

Ce qu'une valeur peut contenir

Des noms, des nombres, des dimensions, des pourcentages, des chaînes, des dièses, des virgules, les délimiteurs / + - *, des parenthèses et des crochets, et les fonctions que la politique permet, dont les arguments sont vérifiés de la même façon. Un deux-points, un point-virgule, un mot-clé @, un bloc {}, tout autre délimiteur, une chaîne invalide ou une URL invalide font refuser la déclaration. url(), avec ou sans guillemets, et chaque image d'image-set() passent par le réécrivain (URL). var() est permis seulement avec les propriétés personnalisées.

attr() prend un nom d'attribut et des noms de types. Le type url est permis seulement quand attr() est le premier argument de target-counter(), target-counters() ou target-text(). Là, il nomme l'élément vers lequel pointe un lien, et ne charge rien.

a::after { content: " (page " target-counter(attr(href url), page) ")" }   /* kept */
a::after { content: attr(href url) }                                       /* removed */

La sortie

La sortie est écrite par le sérialiseur : les noms sont échappés, les chaînes prennent des guillemets doubles, les URL s'écrivent url("…"), les blancs deviennent une seule espace. Elle ne contient jamais </ suivi d'une lettre, pour ne pas pouvoir fermer l'élément <style> dans lequel elle est écrite. Dans un attribut style, échappez-la comme toute valeur d'attribut ; Twig le fait par défaut.