Как я могу сделать HTML безопасным для веб-браузера с помощью python?

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

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

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

Я хотел бы избежать кодирования этого самостоятельно.

Решения, требующие последней версии браузера (firefox), также приемлемы.


person iny    schedule 22.10.2009    source источник
comment
Возможно, вы захотите уточнить, что именно вы подразумеваете под безопасным. Похоже, вы хотите запретить ссылки, но я полагаю, вы также имеете в виду, что хотите быть в безопасности от XSS и т. д.   -  person Dominic Rodger    schedule 22.10.2009
comment
Что вы ожидаете от программы для чтения электронной почты через Интернет? Меня интересуют как более, так и менее безопасные решения.   -  person iny    schedule 22.10.2009


Ответы (3)


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

Нашел его по адресу здесь.

person iny    schedule 23.10.2009

Я не совсем понимаю, что именно вы имеете в виду под словом «безопасно». Это довольно большая тема... но, для чего она стоит:

На мой взгляд, парсер удаления из ActiveState Cookbook — одно из самых простых решений. Вы можете в значительной степени скопировать/вставить класс и начать его использовать.

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

person exhuma    schedule 23.10.2009
comment
Просто подтверждаю, что скрипт действительно больше не оставляет действительных тегов, как заявил комментатор на этой странице. - person ropable; 19.05.2010

Используйте модуль HTMLparser или установите BeautifulSoup и используйте их для анализа HTML и отключения или удаления тегов. Это оставит любой текст ссылки, но он не будет выделен и не будет доступен для кликов, поскольку вы отображаете его с помощью компонента веб-браузера.

Вы могли бы прояснить, что было сделано, заменив <A></A> на <SPAN></SPAN> и изменив оформление текста, чтобы показать, где раньше была ссылка. Возможно, другой оттенок синего, чем обычно, и пунктирное подчеркивание, указывающее на неисправность. Таким образом, вы немного приблизитесь к тому, чтобы отобразить его так, как задумано, не вводя людей в заблуждение, заставляя их нажимать на что-то, что не кликабельно. Вы даже можете добавить наведение в Javascript или чистый CSS, который отображает всплывающую подсказку, объясняющую, что ссылки отключены по соображениям безопасности.

Аналогичные вещи можно сделать с тегами <IMG></IMG>, включая замену их пустым прямоугольником, чтобы убедиться, что макет страницы близок к оригиналу.

Я делал подобные вещи с помощью Beautiful Soup, но HTMLparser входит в состав Python. В старых дистрибутивах Python была htmllib, которая сейчас устарела. Поскольку HTML-код в сообщении электронной почты может быть не совсем правильным, используйте Beautiful Soup 3.0.7a, который лучше справляется с некорректным HTML-кодом.

person Michael Dillon    schedule 22.10.2009
comment
Кликабельные ссылки не проблема. Изображения и другие ссылки обычно извлекаются автоматически. - person iny; 22.10.2009
comment
Правильный анализатор HTML — действительно хорошее начало. Но обязательно работайте с белым списком допустимых тегов и их допустимых атрибутов и удаляйте все остальное. Подход с черным списком, вероятно, будет легко обойти: потенциально опасных тегов/включающих внешний контент намного больше, чем вы думаете, особенно с учетом различий между браузерами. Кроме того, если вам нужно разрешить стили, вам предстоит сложная задача анализа CSS, чтобы разрешить только известные хорошие свойства. - person bobince; 22.10.2009
comment
Вот почему я бы предпочел существующее решение, а не делать его самостоятельно. - person iny; 22.10.2009