Как мне отфильтровать пользовательский ввод css?
Вопрос
В моем приложении я разрешаю пользователям загружать свои таблицы стилей css, чтобы они могли применяться к шаблонам.css написан как внутренняя таблица стилей, потому что в настоящее время я не хотел бы предоставлять таблицу стилей css другим пользователям.
Это создает пространство для пользователей для включения вредоносного кода в файл css.Изначально мой план состоял в том, чтобы преобразовать все '<' и '>', но это необходимо в синтаксисе css.Мне нужно решение из белого списка, поскольку полностью исключить нежелательные символы будет невозможно.
Есть какие-либо предложения по внедрению мер безопасности в этом сценарии?
Решение
Вам определенно следует также отфильтровать, по крайней мере, выражения IE и свойства, привязывающие FF -moz...оба могут быть использованы для запуска (потенциально вредоносного) javascript с использованием css.
Эта шпаргалка содержит наиболее очевидные тактики XSS, включая некоторые CSS-приемы.
Вероятно, самым безопасным решением было бы внесение в белый список, как вы предложили (если допустимо ограничивать пользователей использованием только свойств, внесенных в белый список).
Другие советы
Я внедрил фильтр, который заменяет все <
символы для <
.Причина в том, что CSS не нуждается в <
характер;единственный персонаж, который ему нужен, - это >
который используется для дочерних селекторов.
Таким образом, пользователи не могут открывать теги для написания вредоносного кода.
Я более чем счастлив рассмотреть любые другие / лучшие решения.
Не разрешайте пользователям загружать CSS-ФАЙЛ, создайте интерфейс, который генерирует CSS-файлы динамически на основе параметров, выбранных пользователем.Варианты, которые вы допускаете.затем вы можете создать физический CSS-файл или вы можете создать динамическое приложение, которое пишет CSS на основе этой конфигурации, это позволит избежать большого количества CSS-файлов на сервере...это другой подход, и вам не нужно проверять каждый возможный эксплойт XSS, проще определить, что разрешено, чем разбирать CSS и отклонять некоторый опасный код.
Использование CDATA - ДАННЫЕ и экранируйте завершающую последовательность (]]>
).Однако я не уверен в совместимости с браузером.
Пример (непроверенный):
<?PHP
function strReplaceAll($needle, $replacement, $haystack)
{
// Check for infinite loop. (NOT FOOL PROOF!)
if(strpos($replacement, $needle) === FALSE)
return;
$numReplacements = 42;
while($numReplacements)
{
$haystack = str_replace($needle, $replacement, $haystack, &$numReplacements);
}
return $haystack;
}
?>
<style type="text/css">
/*
<![CDATA[
*/
<?PHP echo sstrReplaceAll(']]>', '', $userCss); ?>
/*
]]>
*/
</style>