Как я могу позволить моему пользователю вставлять HTML-код без риска? (не только технические риски)

Я разработал веб-приложение, которое позволяет моим пользователям управлять некоторыми аспектами веб-сайта динамически (да, какие-то cms) в среде LAMP (debian, apache, php, mysql)

Например, они создают новости в своей частной области на моем сервере, а затем публикуются на их веб-сайте через запрос cURL (или ajax).

Новость создается с помощью редактора WYSIWYG (fck в данный момент, возможно, tinyMCE в следующем будущем).

Итак, я не могу запретить теги html, но как я могу быть в безопасности? Какие теги я ДОЛЖЕН удалить (javascripts?)? Это в смысле быть безопасным сервером .. но как быть «юридически» безопасным? Если пользователь использует мое приложение для создания xss, могу ли я иметь некоторые юридические проблемы?

Если вы используете php, отличное решение – использовать HTMLPurifier . У этого есть много вариантов, чтобы отфильтровать плохие вещи, и как побочный эффект, гарантирует хорошо сформированный выход html. Я использую его для просмотра спама, который может быть враждебной средой.

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

В качестве примера, как вы собираетесь удалить эту действительную атаку XSS:

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

Ваш лучший вариант позволяет только подмножество приемлемых тегов и удалить что-нибудь еще. Эта практика известна как белый листинг и является лучшим методом предотвращения 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=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

Из ответа LFSR Consulting , и он избежал его правильно.

Если слишком сложно удалить теги, вы можете отклонить все html-данные до тех пор, пока пользователь не вступит в действующий. Я бы отклонил html, если он содержит следующие теги:

фреймы, рамка, IFrame, сценарий, объект, вставлять, апплет.

Также тегами, которые вы хотите запретить, являются: head (и подтеги), body, html, потому что вы хотите предоставить их сами, и вы не хотите, чтобы пользователь манипулировал вашими метаданными.

Но, вообще говоря, позволяя пользователю предоставлять свой собственный HTML-код, всегда возникают некоторые проблемы с безопасностью.

Возможно, вы захотите рассмотреть, а не позволить HTML вообще, внедрить некоторые средства для HTML, такие как BBCode или Markdown.