Я пытаюсь закодировать безопасный и легкий белый-основанный на основе 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, который я мог бы на него набросить.
Я высоко ценю все ваши ценные ответы, спасибо.