Угрозы безопасности от пользовательского HTML - PullRequest
2 голосов
/ 24 сентября 2011

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 24 сентября 2011

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

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

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

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

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

или

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

или

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

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

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

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

2 голосов
/ 24 сентября 2011

Да и да.

Существует множество способов для пользователей вводить сценарии без тегов сценария.

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

<div onmouseover="myBadScript()" />

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

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

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

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

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

Боюсь, что идея разрешить пользователям делать это просто не очень хорошая.Взгляните на использование вики-разметки / вниз вместо этого.Это будет намного безопаснее.

1 голос
/ 24 сентября 2011

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

<body onload="..">

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

1 голос
/ 24 сентября 2011

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

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

...