Как мне отфильтровать пользовательский ввод css?

StackOverflow https://stackoverflow.com/questions/661185

  •  20-08-2019
  •  | 
  •  

Вопрос

В моем приложении я разрешаю пользователям загружать свои таблицы стилей css, чтобы они могли применяться к шаблонам.css написан как внутренняя таблица стилей, потому что в настоящее время я не хотел бы предоставлять таблицу стилей css другим пользователям.

Это создает пространство для пользователей для включения вредоносного кода в файл css.Изначально мой план состоял в том, чтобы преобразовать все '<' и '>', но это необходимо в синтаксисе css.Мне нужно решение из белого списка, поскольку полностью исключить нежелательные символы будет невозможно.

Есть какие-либо предложения по внедрению мер безопасности в этом сценарии?

Это было полезно?

Решение

Вам определенно следует также отфильтровать, по крайней мере, выражения IE и свойства, привязывающие FF -moz...оба могут быть использованы для запуска (потенциально вредоносного) javascript с использованием css.

Эта шпаргалка содержит наиболее очевидные тактики XSS, включая некоторые CSS-приемы.

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

Другие советы

Я внедрил фильтр, который заменяет все < символы для &lt;.Причина в том, что 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top