Кэш браузера
4) Кэш браузера
В пункте 1.2 был описан метод проверки изображений, находящихся в кэша браузера.
Недавно я нашел интересный способ проверки кэширования не только изображений, но и текстовых файлов (
html,
js,
css и т.д.). Об этом и пойдет речь.
Same origin policy - политика безопасности браузера, которая запрещает страницам одного сайта получать информацию со страниц другого сайта.
Если разместить на сайте
domain.com страницу
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
function[/COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()
{
[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]frames[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]innerHTML[/COLOR][COLOR="#007700"]);
}
[/COLOR][COLOR="#0000BB"]
[/COLOR][/COLOR]
то фрейм будет загружен, но алерта мы не увидим из-за ограничений
same origin policy. Если ту же страницу разместить на сайте
domain2.com, сработает алерт, которые выведет содержимое
domain2.com/page.htm
Проверим, как поведет себя браузер если загрузить во фрейм страницу своего сайта, а потом изменить ее на страницу другого сайта используя
refresh.
domain.com/page.htm
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
function[/COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()
{
[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'ok'[/COLOR][COLOR="#007700"]);
}
[/COLOR][COLOR="#0000BB"]
[/COLOR][/COLOR]
domain.com/page2.htm
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
[/COLOR][/COLOR]
Мы увидим два алерта. Это происходит потому, что событие
onload срабатывает сначала при загрузке
domain.com/page2.htm, а потом при загрузке
domain2.com/page.htm.
Попробуем вывести в алерте содержимое фрейма. Для этого немного изменим фукнцию
iframeLoad()
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]iframeLoad[/COLOR][COLOR="#007700"]()
{
[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]frames[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#0000BB"]document[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]body[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]innerHTML[/COLOR][COLOR="#007700"]);
}[/COLOR][/COLOR]
На этот раз будет показан только один алерт. Второй блокируется политикой безопасности.
Но если вместо
domain2.com/page.htm мы попробуем перенаправить фрейм на какой-нибудь кэшированный файл, ни одного алерта показано не будет.
domain.com/page2.htm
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
Загрузка файла из кэша происходит настолько быстро, что на момент первого вызова функции
iframeLoad() во фрейме уже находится страница другого сайта (в примере -
www.google.ru)
Если поведение браузера отличается при загруке из кэша и при загрузке с сайта, значит определение кешированных файлов возможно.
PoC:
check.php
PHP код:
[COLOR="#000000"]function checkCache()
{
// функция вызывается 2 раза:
// при загрузке refresh.php
// и при загрузке файла, на который происходит перенаправление
checkCache = null; // отключение повторной сработки после refresh
try
{
document.frames[0].document.body; // обращение к методам и свойствам других сайтов запрещено
alert('bad'); // исключения не было. файл загружен с сайта
}
catch(e)
{
// если есть исключение, значит файл загружен из кэша
alert('good');
}
}
[/COLOR])" src="refresh.php?url=[COLOR="#0000BB"][/COLOR]">[/COLOR]
refresh.php
PHP код:
[COLOR="#000000"][/COLOR]">[/COLOR]