Я разработал веб-приложение, которое позволяет моим пользователям управлять некоторыми аспектами веб-сайта динамически (да, какие-то cms) в среде LAMP (debian, apache, php, mysql)
Например, они создают новости в своей частной области на моем сервере, а затем публикуются на их веб-сайте через запрос cURL (или ajax).
Новость создается с помощью редактора WYSIWYG (fck в данный момент, возможно, tinyMCE в следующем будущем).
Итак, я не могу запретить теги html, но как я могу быть в безопасности? Какие теги я ДОЛЖЕН удалить (javascripts?)? Это в смысле быть безопасным сервером .. но как быть «юридически» безопасным? Если пользователь использует мое приложение для создания xss, могу ли я иметь некоторые юридические проблемы?
Если вы используете php, отличное решение – использовать HTMLPurifier . У этого есть много вариантов, чтобы отфильтровать плохие вещи, и как побочный эффект, гарантирует хорошо сформированный выход html. Я использую его для просмотра спама, который может быть враждебной средой.
Неважно, что вы хотите удалить, кто-то всегда найдет способ обойти его. В качестве справочного материала рассмотрим этот чит-лист XSS .
В качестве примера, как вы собираетесь удалить эту действительную атаку XSS:
<IMG SRC=javascript:alert('XSS')>
Ваш лучший вариант позволяет только подмножество приемлемых тегов и удалить что-нибудь еще. Эта практика известна как белый листинг и является лучшим методом предотвращения XSS (помимо запрета HTML).
Также используйте чит-лист в своем тестировании; как можно больше на своем веб-сайте, и попытаться найти некоторые способы выполнения XSS.
Общая лучшая стратегия здесь – это белый список конкретных тегов и атрибутов, которые вы считаете безопасными, и избегать / удалять все остальное. Например, разумный белый список может быть <p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>
. В качестве альтернативы рассмотрите удобную для пользователя разметку, такую как Textile или Markdown, которая может быть легко преобразована в безопасный HTML.
Вместо того, чтобы разрешать HTML, вы должны иметь другую разметку, которая может быть преобразована в HTML. Попытка вычеркнуть изгоев HTML из пользовательского ввода практически невозможна, например
<scr<script>ipt etc="...">
Удаление из этого уйдет
<script etc="...">
Для примера C # метода белого списка, который использует stackoverflow , вы можете посмотреть эту страницу .
Помощник по безопасности Коханы очень хорош. Из того, что я помню, он был взят из другого проекта.
Однако я тестировал
<IMG SRC=javascript:alert('XSS')>
Из ответа LFSR Consulting , и он избежал его правильно.
Если слишком сложно удалить теги, вы можете отклонить все html-данные до тех пор, пока пользователь не вступит в действующий. Я бы отклонил html, если он содержит следующие теги:
фреймы, рамка, IFrame, сценарий, объект, вставлять, апплет.
Также тегами, которые вы хотите запретить, являются: head (и подтеги), body, html, потому что вы хотите предоставить их сами, и вы не хотите, чтобы пользователь манипулировал вашими метаданными.
Но, вообще говоря, позволяя пользователю предоставлять свой собственный HTML-код, всегда возникают некоторые проблемы с безопасностью.
Возможно, вы захотите рассмотреть, а не позволить HTML вообще, внедрить некоторые средства для HTML, такие как BBCode или Markdown.