Какие символы безопасно не использовать в контексте значения CSS?

У меня есть строка, которая поступает от пользователя, а затем вставляется в большой блок CSS с помощью синтаксического анализатора CSS.

Экранирование CSS можно выполнить с помощью \C (где C — символ), \HexOfC  (с пробелом) или \6DigitHexOfC.

Как правило, все символы можно безопасно экранировать, и CSS по-прежнему будет работать должным образом. Следующие работы:

div {
  background: \23 f66;
}
<div>Test</div>

Тем не менее, я по-прежнему хочу, чтобы свойства CSS были как можно более «чистыми», потому что я хочу, например, иметь возможность четко просматривать URL-адреса и правила с помощью инспектора.


Есть персонажи, которые явно плохие. {};\* следует экранировать, потому что их можно использовать для нарушения текущего правила. Я управляю белым списком (все экранируется, кроме разрешенного) символов (в отличие от черного списка, где разрешено все, кроме разрешенного). Персонажи из белого списка, которые у меня есть в настоящее время,

'#', ',', '.', '(', ')', '-', '%', '+', '=', '/', ' ', ':', '\'', '"', '\n', '\r'

Есть ли здесь опасные персонажи? Все, что можно использовать, чтобы нарушить правило и повлиять на остальную часть блока CSS. Есть ли персонажи, которых здесь нет, которые могли бы быть ненужно сбежавшими? (По умолчанию буквенно-цифровые символы не экранируются).


person Madara's Ghost    schedule 02.10.2014    source источник


Ответы (1)


Вместо очистки ввода вы можете просто разрешить передачу элементов.

В основном клиент создал структурный файл:

[
    MyDiv: { # Key
        background: "#FFFFFF" # Element
    }
]

В этом случае вам просто нужно создать файл.

Фиктивный код:

StringBuilder sb = new StringBuilder();
foreach(String key: structure.getKeys()) {
    final List<Element> e = structure.getElements(key);
    sb.append(".") // This may be changed of course
      .append(key) // ID or class based on type above
      .append("{")
      // Append Elements
      .append("}");
}

Создание элементов должно быть простым.

Каждый элемент просто

S := элемент-ключ : элемент-значение;

Тогда вы также сможете внести в белый список специальные команды.

Если вы хотите продолжить дезинфекцию, загляните сюда: http://www.w3.org/TR/CSS21/grammar.html#scanner

person manf    schedule 04.10.2014
comment
Как это мне поможет? Что мешает пользователю вставить злой CSS? - person Madara's Ghost; 04.10.2014
comment
Как он должен? Вы можете разрешить/запретить любой элемент по вашему желанию, отфильтровав элемент-ключ. div, ключи элементов и сами значения элементов должны быть A-Z, a-z, 0-9, # и . Вы избегаете расширенной фильтрации, если конвертируете каждый элемент вручную. - person manf; 04.10.2014