Возможно, стоит спросить coderesearch@google.com.Их исследование 2005 года (http://code.google.com/webstats/) не охватывает ваш конкретный вопрос. Тем не менее, они отобрали более миллиарда документов и заинтересованы в том, чтобы услышать обо всем, что, по вашему мнению, стоит изучить.
- [Обновление] -
Вот грубый сценарий, который я написал для проверки имеющихся у меня браузеров (поместив количество элементов для вложения в строку запроса):
var n = Number(window.location.search.substring(1));
var outboundHtml = '';
var inboundHtml = '';
for(var i = 0; i < n; i++)
{
outboundHtml += '<div>' + (i + 1);
inboundHtml += '</div>';
}
var testWindow = window.open();
testWindow.document.open();
testWindow.document.write(outboundHtml + inboundHtml);
testWindow.document.close();
И вот мои выводы(может относиться к моей машине, Win XP, 3Gb Ram):
- Chrome 9: рендерится вложенные элементы 3218, вкладка сбоев 3129. (Chrome 9 старый, я знаю, на моем сбое обновлениякорпоративная локальная сеть)
- Safari 5: 3477 выполнит рендеринг, браузер 3478 полностью закроется.
- IE8: 1000000+ выполнит рендеринг (если позволяет память), хотя при значительных четырехзначных числах производительность значительно снижаетсяк появлению пузырьков при прокрутке / перемещении мыши и т. д. Все, что превышает 10000, кажется заблокированным, но я думаю, что просто занимает очень много времени, поэтому эффективна DoS.
- Opera11: Насколько я могу судить, ограничено только памятью, т.е. моему скрипту не хватает памяти на 10000000. Однако для больших документов, которые визуализируются, не наблюдается никакого снижения производительности, как в IE.
- Firefox 3.6: ~ 1500000 будет рендериться, но тестирование выше этого диапазона привело к сбою браузера с Mozilla Crash Reporter или просто зависанию, иногда работающее число не получалось в следующий раз, но большие числа ~ 1700000 приводили к сбою Firefox сразу после перезапуска.
Подробнее о Chrome:
Изменение DIV на SPAN привело к тому, что Chrome смог вложить 9202 элементов перед сбоем.Поэтому причина заключается не в размере HTML (хотя элементы SPAN могут быть более легкими).
Вложенные ячейки таблицы 2077 (<table><tr><td>
) работали (6231 элемент), пока вы не прокрутили до ячейки 445затем произошел сбой, поэтому вы не можете вложить 445 ячеек таблицы (1335 элементов).
Тестирование с использованием файлов, сгенерированных из сценария (в отличие от записи в новые окна), дает несколько более высокие допуски, но Chrome все еще падает.
Вы можете вложить 1409 элементов списка (<ul><li>
) до его сбоя, что интересно , потому что:
- Firefox останавливает отступ элементов списка после 99,может быть программное ограничение.
- Opera продолжает отступать с глюками на 250, 376, 502, 628, 754, 880 ...
Установка DOCTYPE эффективна в IE8 (если поставитьв стандартном режиме, то есть var outboundHtml = '<!DOCTYPE html>';
): он не будет вкладывать 792 элемента списка (вкладка вылетает / закрывается) или 1593 DIV.В IE8 не имеет значения, был ли тест сгенерирован из сценария или загружен из файла.
Таким образом, предел вложенности браузера, по-видимому, зависит от типа HTML-элементов, внедряемых злоумышленником, и от механизма компоновки.,Там может быть немного HTML значительно меньше, чем этот.И у нас есть обычные DoS в формате HTML для пользователей IE8, Chrome и Safari со значительно меньшей полезной нагрузкой.
Похоже, если вы собираетесь разрешить пользователям публиковать HTML, который отображается на одной из ваших страниц, этоСтоит рассмотреть ограничение на вложенные элементы, если есть щедрый размер ограничения.