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

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

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

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

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

Ответы [ 10 ]

15 голосов
/ 31 марта 2009

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

11 голосов
/ 31 марта 2009

Неважно, что вы хотите удалить, кто-то всегда найдет способ обойти это. Для справки взгляните на эту 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.

6 голосов
/ 31 марта 2009

Общая лучшая стратегия здесь состоит в том, чтобы вносить в белый список определенные теги и атрибуты, которые вы считаете безопасными, и избегать / удалять все остальное. Например, разумный белый список может быть <p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>. В качестве альтернативы можно рассмотреть удобную для человека разметку, такую ​​как Текстильная или Уценка , которую можно легко преобразовать в безопасный HTML.

2 голосов
/ 31 марта 2009

Для примера C # подхода белого списка, который stackoverflow использует, вы можете посмотреть на эту страницу .

2 голосов
/ 31 марта 2009

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

<scr<script>ipt etc="...">

Удаление от этого оставит

<script etc="...">
1 голос
/ 09 ноября 2009

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

Однако я проверил

<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 , и он правильно избежал его.

0 голосов
/ 10 января 2018

Я использую эту функцию php strip_tags, потому что я хочу, чтобы пользователь мог безопасно публиковать сообщения, и я разрешаю лишь несколько тегов, которые можно использовать в публикации таким образом, что никто не сможет взломать ваш сайт с помощью внедрения скрипта, поэтому я думаю, что strip_tags - лучший вариант

Кликните здесь для кода этой функции php

0 голосов
/ 10 января 2018

code that I should have just copy/pasted instead of screenshotting

Это очень хорошая функция в PHP, вы можете использовать его

$string = strip_tags($_POST['comment'], "<b>");
0 голосов
/ 31 марта 2009

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

0 голосов
/ 31 марта 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...