我在一个网站上工作,我想让用户能够在其中输入自定义 CSS,并将公开显示。
然而,鉴于可以通过 CSS 执行大量 XSS 攻击,我希望能够找到一种“清理”CSS 输出的方法,类似于 HTML Purifier 的方法。通过解析 CSS,针对白名单运行解析的 CSS,然后根据解析的和列入白名单的 CSS 输出新的样式表。
那里已经有这样的图书馆了吗?如果没有,是否有可用于创建自定义实现的 CSS 解析库?
最佳答案
我猜你会编写自己的 CSS 解析器和过滤器,所以我会考虑以下内容,尽管我从未做过这样的事情:
- 制作一个(白)列表,列出您的用户可以使用的可接受的 CSS 属性。喜欢:
color
,font-family
。 - 我相信最好不要使用诸如
background
之类的简写形式,至少在开始时是这样,这样您就可以轻松地解析值。要求他们显式写入background-color
、background-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/