XSS - Какие HTML-теги и атрибуты могут запускать события Javascript?

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

  • HTML-комментарии удалены
  • script и теги стиля удаляются все вместе
  • только дочерние узлы тег body будет возвращен
  • все атрибуты HTML, которые могут запускать события Javascript, будут либо проверены, либо удалены

Я много читал о XSS-атаках и предотвращении, и я надеюсь, что ' m не слишком наивен (если да, дайте мне знать!), предполагая, что если я буду следовать всем правилам, упомянутым выше, я буду в безопасности от XSS.

Проблема в том, что я не уверен, какие еще теги и атрибуты (в любой версии [X] HTML и / или версиях / реализациях браузера) могут инициировать события Javascript, помимо атрибутов событий Javascript по умолчанию :

  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDblClick
  • onDragDrop
  • onError
  • onFocus
  • onKeyDown
  • onKeyPress
  • onKeyUp
  • onLoad
  • onMou seDown
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onMove
  • onReset
  • onResize
  • onSelect
  • onSubmit
  • onUnload

Есть ли другие не- атрибуты событий по умолчанию или проприетарные атрибуты, которые могут запускать события Javascript (или VBScript и т. д.) или выполнение кода? Я могу вспомнить href , style и action , например:

XSS // or
XSS // or

Я, вероятно, просто удалю все атрибуты стиля в HTML-теги, атрибуты action и href представляют большую проблему, но я думаю, что следующего кода достаточно, чтобы убедиться, что их значение является относительным или абсолютным URL-адресом, а не каким-то неприятным кодом Javascript. :

$value = $attribute->value;

if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
    $node->removeAttributeNode($attribute);
}

Итак, у меня есть два очевидных вопроса:

  1. Не хватает ли мне каких-либо тегов или атрибутов, которые могут запускать события?
  2. Есть ли какой-либо вектор атаки, который не охвачен этими правилами?

После большого количества запросов тестирование, размышления и исследования Я придумал следующую (довольно простую) реализацию , которая, кажется, неуязвима для любого вектора атаки XSS, который я мог бы использовать.

Я высоко ценю все ваши ценные вещи. ответы, спасибо.

21
задан Alix Axel 18 August 2011 в 19:38
поделиться