Показать сообщение отдельно

  #4  
Старый 21.09.2012, 02:00
M_script
Новичок
Регистрация: 04.11.2004
Сообщений: 5
С нами: 11322426

Репутация: 0
По умолчанию

Кэш браузера

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] 
 
Ответить с цитированием