Как я могу фильтровать пользовательский ввод css? - PullRequest
1 голос
/ 19 марта 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 19 марта 2009

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

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

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

1 голос
/ 20 марта 2009

Не разрешайте пользователям загружать ФАЙЛ CSS, создайте интерфейс, который генерирует файлы CSS динамически на основе параметров, выбранных пользователем. Варианты, которые вы позволяете. затем вы можете создать физический CSS-файл или создать динамическое приложение, которое пишет CSS на основе этой конфигурации, это позволяет избежать большого количества CSS-файлов на сервере ... это другой подход, и вам не нужно проверять все возможные XSS-эксплойты. проще определить, что разрешено, чем анализировать CSS и отклонять опасный код.

1 голос
/ 19 марта 2009

Я реализовал фильтр, который заменяет все символы < на &lt;. Причина в том, что CSS не нуждается в символе <; единственный необходимый ему символ - это >, который используется для дочерних селекторов.

Таким образом, пользователи не могут открывать теги для написания вредоносного кода.

Я более чем рад рассмотреть любые другие / лучшие решения.

0 голосов
/ 19 марта 2009

Используйте 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...