php - 如何在 PHP 中执行基于白名单的 XSS 过滤

标签 php css validation user-input

我在一个网站上工作,我想让用户能够在其中输入自定义 CSS,并将公开显示。

然而,鉴于可以通过 CSS 执行大量 XSS 攻击,我希望能够找到一种“清理”CSS 输出的方法,类似于 HTML Purifier 的方法。通过解析 CSS,针对白名单运行解析的 CSS,然后根据解析的和列入白名单的 CSS 输出新的样式表。

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

最佳答案

我猜你会编写自己的 CSS 解析器和过滤器,所以我会考虑以下内容,尽管我从未做过这样的事情:

  • 制作一个(白)列表,列出您的用户可以使用的可接受的 CSS 属性。喜欢:colorfont-family
  • 我相信最好不要使用诸如 background 之类的简写形式,至少在开始时是这样,这样您就可以轻松地解析值。要求他们显式写入 background-colorbackground-image
  • 如果您需要 URL,则只允许使用相对 URL,并丢弃所有看起来都不像 URL 的内容。无论如何记录这些问题,以便您可以改进解析器和验证器。
  • 在解析时要非常严格,丢弃所有你的解析器不理解的东西,即使它是有效的 CSS。换句话说,制作您自己的 CSS 子集。

解析时,最难的部分是解析complex CSS selectors。 .但您也可以在此处强加您自己的子集。

这是一些(伪)代码,也许它会以某种方式帮助你:

<?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;
    }
}

关于php - 如何在 PHP 中执行基于白名单的 XSS 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364302/

相关文章:

php - Symfony2 - Doctrine - 更新后没有变更集

css - 一般 Assets 和布局的地方

jquery - 单击离开输入框后如何去除框阴影?

html - 我根本不知道这里发生了什么,我使用了 fontawesome

c# - ASP.NET MVC。是否可以使用 MVC Foolproof Validation 进行数组验证?

php pdo一次插入太多行的有效方法

php - mysql返回特定行的数字?

validation - 具有一对多的未保存域类以随机顺序返回子对象

python - 在 Python 中自定义验证器的正则表达式

PHP 退出后不加载页面的其余部分;