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