Я работаю над сайтом, и я хотел бы, чтобы пользователь мог ввести пользовательский CSS, который будет публично отображаться.
Однако, видя, что большое количество атак XSS можно предварительно сформировать с помощью CSS, я хотел бы найти способ «очистить» вывод CSS, подобно тому, как работает HTML-очиститель , путем разбора CSS, запуская анализируемый CSS против белого списка, а затем вывод новой таблицы стилей на основе проанализированного и белого списка CSS.
Есть ли там такая библиотека? Если нет, существует ли библиотека разбора CSS, которая может быть использована для создания пользовательской реализации?
Думаю, вы собираетесь написать свой собственный синтаксический анализатор и фильтр, поэтому я подумал, хотя я никогда не делал такого:
color
, font-family
. background
, по крайней мере, в начале, чтобы вы могли легко анализировать значения. Требовать, чтобы они явно записывали background-color
, background-image
. При разборе наиболее сложной частью будет синтаксический анализ сложных селекторов CSS . Но вы также можете наложить свой собственный подмножество.
Вот какой-то (псевдо) код, возможно, это поможет вам как-то:
<?php function tokenizeCSS() { return array( array( 'selector' => '#foo .bar', 'properties' => array( 'background-color' => 'transparent', 'color' => '#fff', ), ); ); } function colorValidator($color) {} /** * This is basically the white list. Keys are accepted CSS properties * and values are the validator callbacks. */ $propertyValidators = array( 'background-color' => 'colorValidator', 'color' => 'colorValidator', ); $filteredRules = array(); foreach (tokenizeCSS() as $rule) { if (! validSelector($rule['selector'])) { continue; } foreach ($rule['properties'] as $property => $value) { /** * Check property is in white list */ if (! isset($propertyValidators[$property]) { continue; } /** * Check property is valid */ if (! $propertyValidators[$property]($value)) { continue; } /** * Valid rule */ $filteredRules[$rule['selector']][$property] = $value; } }