Угрозы безопасности из-за отправленного пользователем HTML

Я использую div contentEditable, который позволяет пользователям редактировать основной HTML-код, а затем размещать его непосредственно на сайте с помощью запроса AJAX. Естественно, мне нужно проверить его безопасность. Самым очевидным было обеспечение того, чтобы теги сценария не были отправлены путем поиска <script в отправленном HTML. Это делается после первого запуска htmlentities, передачи данных на другой сервер и последующего запуска html_entity_decode. Кроме того, каждый открываемый тег должен быть закрыт, и каждый закрываемый тег должен быть открыт в HTML, отправленном пользователем.

Не обращая внимания на несвязанные риски безопасности (например, SQL-инъекцию) и риски, не связанные с безопасностью (например, когда пользователь публикует несоответствующее изображение), каковы другие угрозы безопасности, если таковые имеются, конкретно связанные с разрешением пользователю добавлять HTML прямо на страницу?

Чтобы быть более конкретным,

  1. Есть ли способы разместить скрипты на странице без явного использования тега скрипта, ИЛИ
  2. Есть ли способы поставить под угрозу безопасность сайта или его пользователей путем редактирования HTML без использования скриптов?

person Deets McGeets    schedule 24.09.2011    source источник
comment
возможный дубликат рекомендации по предотвращению xss-атак на PHP-сайте   -  person Quentin    schedule 24.09.2011
comment
Это, безусловно, часть этого вопроса, но этот вопрос немного шире. Я считаю, что здесь был дан идеальный ответ на этот вопрос, тогда как ответы на этот вопрос не очень хорошо подходят для этого.   -  person Deets McGeets    schedule 24.09.2011


Ответы (4)


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

<body onload="..">

Аналогичный вопрос размещен на здесь рекомендует использовать HTMLPurifier вместо того, чтобы пытаться справиться с этим самостоятельно.

person Rusty Fausak    schedule 24.09.2011
comment
И сообщение от @JasonDean, и это были чрезвычайно полезны и хорошо ответили на этот вопрос. Я обязательно воспользуюсь HTMLPurifier. - person Deets McGeets; 24.09.2011

Да и да.

Есть МНОГО способов внедрить скрипты без тегов скриптов.

Они могут делать это в обработчиках JS

<div onmouseover="myBadScript()" />

Они могут сделать это в hrefs

<a href="javascript:myBadScript()">Click me fool!!</a>

Они могут сделать это из внешнего источника

<iframe src="http://www.myevilsite.com/mybadscripts.html" />

Они могут делать это ВСЕМИ СПОСОБАМИ.

Боюсь, что позволить пользователям делать это просто не очень хорошо. Попробуйте вместо этого использовать разметку Wiki. Так будет намного безопаснее.

person Jason Dean    schedule 24.09.2011

да. Существует тревожное количество способов внедрения вредоносного кода на ваш сайт.

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

Вам необходимо проверить все атрибуты обработки событий - не только onclick, но все: onfocus, onload, даже onerror и onscroll могут быть взломаны.

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

<!--<img src="--><img src=fakeimageurl onerror=MaliciousCode();//">

or

<style><img src="</style><img src=fakeimageurl onerror=DoSomethingNasty();//">

or

<b <script>ReallySneakyJavascript();</script>0

Все это может легко проскользнуть мимо валидатора.

И не забывайте, что настоящий взлом может быть более запутанным, чем этот. Они будут прилагать усилия, чтобы вам было трудно заметить или понять, что он делает, а вы это делаете.

В заключение я порекомендую этот сайт: http://html5sec.org/, который содержит подробную информацию о большом количестве атак. векторы, о большинстве из которых я бы точно не подумал. (приведенные выше примеры представлены в списке)

person Spudley    schedule 24.09.2011

Задумывались ли вы об угрозе безопасности от <object> и <embed> объектов?

Я бы использовал strip_tags() для удаления тегов HTML

person genesis    schedule 24.09.2011