Зачем использовать белый список для очистки HTML?

Я часто задавался вопросом: зачем использовать белый список, а не черный, при очистке ввода HTML?

Сколько хитрых HTML-трюков существует для открытия XSS-уязвимостей? Очевидно, что теги скриптов и фреймы не разрешены, и для полей в элементах HTML будет использоваться белый список, но зачем запрещать большую часть всего?


person Carson Myers    schedule 19.03.2010    source источник


Ответы (7)


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

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

Если браузеры добавляют новые функции, ваш черный список устаревает.

person Quentin    schedule 19.03.2010
comment
Ах, мне пришел в голову аспект «меньше места для человеческой ошибки» (и, конечно, я использую белый список), мне просто любопытно, насколько фундаментальной на самом деле является эта часть безопасности. - person Carson Myers; 19.03.2010
comment
@Carson: Основная часть - это добавление браузерами новых функций. У вас просто нет способа предсказать это. Можно также утверждать, что учет человеческих ошибок является основной идеей безопасности в целом, отсюда и исключение чего-либо из белого списка. - person sleske; 19.03.2010
comment
Кроме того, даже если вы следите за новыми функциями браузера, существует проблема недокументированных функций (см., например, ответ Икке), которые могут вас укусить. - person sleske; 19.03.2010

Только вчера что-то читал об этом. Он находится в руководстве feedparser.

Фрагмент:

Чем больше я исследую, тем больше случаев, когда Internet Explorer для Windows воспринимает, казалось бы, безобидную разметку как код и беспечно выполняет ее. Вот почему Universal Feed Parser использует белый, а не черный список. Я достаточно уверен, что ни один из элементов или атрибутов в белом списке не представляет угрозы безопасности. Я совсем не уверен в элементах или атрибутах, которые я явно не исследовал. И я совсем не уверен в своей способности обнаруживать строки в значениях атрибутов, которые Internet Explorer для Windows будет интерпретировать как исполняемый код. Я не буду пытаться сохранить «только хорошие стили». Все стили убраны.

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

person Ikke    schedule 19.03.2010
comment
Хороший момент, хотя я не могу придумать ничего, что могло бы создать угрозу безопасности, о чем я еще не знаю. Не могли бы вы предоставить ресурс для таких, казалось бы, невинных, но каким-то образом пригодных для эксплуатации HTML-элементов? - person Carson Myers; 19.03.2010
comment
@Carson - да, но как насчет нового эксплойта, который появится завтра? Если у вас плотный белый список - никаких обновлений не требуется. Если у вас черный список в 30 приложениях - много обновлений - person Damien_The_Unbeliever; 19.03.2010

Несмотря на то, что теги script и теги кадров не разрешены, вы все равно можете поместить любой тег, подобный этому.

<test onmouseover=alert(/XSS/)>mouse over this</test>

и многие браузеры работают.

person YOU    schedule 19.03.2010
comment
это хороший пример, но, конечно, с белым или черным списком поля элементов, такие как onmouseover и тому подобное, в любом случае будут удалены из тегов. - person Carson Myers; 19.03.2010
comment
Правда, я просто хотел упомянуть о тегах, onmouseover — это только один, который пришел мне на ум в данный момент. - person YOU; 19.03.2010

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

Белые списки используются в большинстве тем, связанных с безопасностью. Подумайте о брандмауэрах. Первое правило — блокировать любой (входящий) трафик, а затем открывать только те порты, которые должны быть открыты. Это делает его намного более безопасным.

person Felix Kling    schedule 19.03.2010

Потому что другие теги могут нарушить макет страницы. Представьте, что произойдет, если кто-то введет тег <style>. Тег <object> также опасен.

person Pavel Nikolov    schedule 19.03.2010
comment
Это правда, </div> тоже мог бы это сделать, я полагаю - person Carson Myers; 19.03.2010
comment
На самом деле это не отвечает на вопрос, черный список также может остановить эти теги. - person Andy E; 19.03.2010
comment
@ И мог бы, но я думаю, что это также добавляет к тому, что есть так много вещей, которые нужно учитывать, что слишком легко списать что-то как безопасное. Очевидно, теги стиля будут запрещены, но, честно говоря, я мог и забыть, что <object> вообще существует. - person Carson Myers; 19.03.2010

Я предпочитаю использовать и то, и другое. Я называю это подходом «Черный список с упрощенным белым списком»:

  1. Создайте непринужденный «Белый список» тегов и атрибутов.
  2. Создайте «черный список для белого списка», любой тег/атрибут в черном списке ДОЛЖЕН существовать в созданном вами белом списке, иначе появится ошибка.

Этот черный список действует как переключатель для тегов/атрибутов в смягченном белом списке.

Такой подход «Черный список с упрощенным белым списком» значительно упрощает настройку фильтра очистки.

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

person Basil Musa    schedule 02.12.2015

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

См. лекцию Рубен ван Вриланд Как мы взломали LinkedIn и что произошло дальше для хорошего ознакомления с XSS-уязвимостями и почему вы хотите, чтобы ваш белый список был максимально строгим!

person John Slegers    schedule 12.01.2016