Какие есть безопасные и небезопасные стили css (что мы будем отфильтровывать, а что разрешать)?

Я хочу разрешить пользовательские css, отправленные пользователями на моем веб-сайте.

Я знаю, что некоторые комбинации стилей могут быть небезопасными, например position:absolute.

И все же вышесказанное не повредит, если мы обернем этот контент в div с position:relative.

Я также слышал, что есть некоторые возможности для выполнения скрипта через css, но я не мог вспомнить или придумать что-либо.

Итак, мой вопрос:

  • Какие из них можно считать безопасными?
  • А что попадет в черный список?

В идеале я собираюсь написать функцию, которая будет принимать содержимое тегов style="*" и соответствующим образом очищать их.

Я бы также рассмотрел несколько советов, какой подход будет лучше:

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

Если у вас есть какие-то обширные функции в вашей артиллерии - это правильное место, чтобы выплюнуть их! :-)


person Anonymous    schedule 04.08.2012    source источник
comment
Нестандартные свойства behavior и expression IE будут первыми в списке. Однако я бы определенно предпочел белый список черному списку. Тем не менее, я не знаю, будет ли даже белый список охватывать все случаи.   -  person BoltClock    schedule 04.08.2012
comment
Я никогда не слышал, что position:absolute может быть небезопасным. Я понимаю, что behavior, expression и свойства, которые принимают URL, могут быть небезопасными, но position?   -  person bfavaretto    schedule 04.08.2012
comment
@Boltclok Да, в идеале нам просто не нужно было бы разрешать их все, некоторые из них устарели, некоторые просто необычны и бесполезны, для других требуется css3, который мы могли бы безопасно исключить. Я могу ошибаться, но я предполагаю, что в большинстве ситуаций будет достаточно около 30 в белом списке.   -  person Anonymous    schedule 04.08.2012
comment
@bfavaretto, ты прав, возможно, это не лучший пример. Тем не менее, я видел довольно много людей, жалующихся на это.   -  person Anonymous    schedule 04.08.2012
comment
Это может быть небезопасно в том смысле, что может сломать ваш макет, если вы не знаете, что делаете...   -  person bfavaretto    schedule 04.08.2012
comment
вы уверены, что «небезопасно» означает только нарушение вашего собственного макета? я не очень разбираюсь в безопасности css, но я могу представить, что, например. на facebook пользователь создает свой собственный css, затем другой пользователь заходит на страницу и... его браузер перестает отвечать, отправляет запросы на таблицы стилей с файлами cookie, запускает внедренные js и т. д. это невозможно?   -  person piotrek    schedule 05.08.2012


Ответы (1)


Вам нужно определить, что вы подразумеваете под безопасностью. Если вы имеете в виду «не позволяйте пользователю ломать мой макет», то я не думаю, что вы можете позволить пользователю вообще использовать CSS. Возможно, шрифт, цвета и фон будут в порядке, чтобы позволить пользователю изменяться, но помимо этого вы напрашиваетесь на неприятности. (даже такие вещи, как поля и отступы, могут быть «забавными» с отрицательными значениями в любом поле, особенно в сочетании с zindex...) Как правило, если бы для этого были теги HTML (например, <font>, <i> и т. ) тогда все будет в порядке.

Теперь, если вы говорите о безопасности в том смысле, что хотите предотвратить проблемы с межсайтовым скриптингом, вам нужно запретить любые элементы css, которые потенциально могут выполнять код. (например, как указывает комментарий BoltClock)

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

person Billy ONeal    schedule 05.08.2012