Я пытаюсь закодировать безопасный и легкий белый-основанный на основе HTML очиститель, который будет использовать DOMDocument. Чтобы избежать ненужной сложности, я готов сделать следующие компромиссы:
- HTML-комментарии удалены Теги
 -  
scriptиstyleразделяются вместе -  будут возвращены только дочерние узлы тега 
body - все атрибуты HTML, которые могут инициировать события Javascript, будут либо проверены, либо удалены.
 
Я много читал об атаках и предотвращении XSS, и я надеюсь, что я не слишком наивна (если да, дайте мне знать!) в предположении, что если я буду следовать всем правилам, упомянутым выше, Я буду в безопасности от XSS.
Проблема заключается в том, что я не уверен, что другие теги и атрибуты (в любой версии [X] HTML и/или версиях/реализациях браузера) могут инициировать события Javascript, кроме атрибуты событий Javascript по умолчанию:
-  
onAbort -  
onBlur -  
onChange -  
onClick -  
onDblClick -  
onDragDrop -  
onError -  
onFocus -  
onKeyDown -  
onKeyPress -  
onKeyUp -  
onLoad -  
onMouseDown -  
onMouseMove -  
onMouseOut -  
onMouseOver -  
onMouseUp -  
onMove -  
onReset -  
onResize -  
onSelect -  
onSubmit -  
onUnload 
Существуют ли какие-либо другие атрибуты событий, не относящиеся к умолчанию или запатентованные, которые могут вызывать события Javascript (или VBScript и т.д.) или выполнение кода? Я могу думать о href, style и action, например:
<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>
Я, вероятно, просто удалю любые атрибуты style в тегах 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);
}
Итак, мои два очевидных вопроса:
- Я пропускаю теги или атрибуты, которые могут вызывать события?
 - Есть ли какой-либо вектор атаки, который не распространяется на эти правила?
 
После большого количества тестов, размышлений и исследований я придумал следующую (довольно простую) реализацию, которая, кажется, невосприимчива на любой вектор атаки XSS, который я мог бы на него набросить.
Я высоко ценю все ваши ценные ответы, спасибо.