Как формовать основанный на белом списке CSS, просачивающийся PHP

Если Вы URLEncode строка прежде, чем добавить его к URL, у Вас не будет ни одной из тех проблем (автоматический URLDecode возвратит его исходному состоянию).

9
задан MiffTheFox 1 September 2009 в 08:44
поделиться

1 ответ

Думаю, вы собираетесь написать свой собственный синтаксический анализатор и фильтр CSS, поэтому вот что я хотел бы рассмотреть, хотя я никогда не делал ничего подобного:

  • Сделайте (белый ) список допустимых свойств CSS, которые могут использовать ваши пользователи. Например: цвет , font-family .
  • Я считаю, что было бы лучше не разрешать сокращенные формы, такие как background , по крайней мере, в начало, так что вы можете легко проанализировать значения. Требовать, чтобы они явно писали background-color , background-image .
  • Если вам нужны URL-адреса, разрешайте только относительные URL-адреса и отбрасывайте все, что даже близко не похоже на URL. В любом случае регистрируйте эти проблемы, чтобы вы могли улучшить свой синтаксический анализатор и валидатор.
  • Будьте очень строги в анализе, отбросьте все, что ваш парсер не понимает, даже если это будет действительный CSS. Другими словами, создайте собственное подмножество CSS.

Самой сложной частью анализа будет анализ сложных селекторов 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;
    }
}
4
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: