如何在瓶坯基于PHP的白名单,CSS过滤(How to preform whitelist-base

2019-07-04 07:24发布

我工作的一个网站,我想就能够进入自定义CSS成将公开显示的用户。

然而,看到的XSS攻击的一个很好的协议可以通过CSS来预成形,我希望能够找到一个方法来“干净”的CSS输出,类似于如何HTML净化器的工作原理,通过解析CSS,运行解析CSS针对白名单,然后输出基于解析和白名单CSS新的样式表。

有没有已经这样了有图书馆? 如果没有,是否有可用于创建自定义实施CSS解析库?

Answer 1:

我猜你会写自己的CSS解析器和过滤器,所以这里就是我会考虑,但我从来没有做过这样的事情:

  • 让您的用户可以使用接受CSS属性的(白)名单。 像: colorfont-family
  • 我认为这可能是最好不要让简写形式,如background ,至少在开始的时候,让你可以轻松地解析值。 要求他们明确写入background-colorbackground-image
  • 如果你想要的网址,只允许相对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;
    }
}


文章来源: How to preform whitelist-based CSS filtering in PHP