Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   iframe и чужой домен (https://javascript.ru/forum/misc/51527-iframe-i-chuzhojj-domen.html)

hated8 10.11.2014 10:07

iframe и чужой домен
 
Прошу не закидывать камнями - знаю что тема уже избитая но всё же не могу не задать свой вопрос, может будет предложено более подходящее решение.
В общем стоит задача определять был ли пользователь у нас ранее или нет, чтобы дать/недать ему пробный бесплатный период доступа. Только это должен быть точный признак ибо лучше дать повторно, чем не дать по ошибке тому кто должен его получить. Соответственно методы определения по ip,useragent, плагинам, разрешению экрана и т.п. отпадают из за своей погрешности. Остаются только куки. И естественно куки со своего домена это слишком очевидно - нужно оставлять их на посторонних доменах, что бы халявщику было сложнее их определить. понятно, что продвинутых это не остановит, но хотя бы халявщики-чайники поотпадают.
Итак куки с другого домена у нас сейчас работают но по средствам редиректов. Это слишком видно - хочется чтобы они создавались и проверялись в фоне. Ну с созданием проблем нет iframe display:none - и кука готова. Но вот как быть с чтением?
К содержимому ифрейма прогрузившего чужой домен как известно не подкопаться =(.
Вот собственно и вопрос как прочитать куки с чужого(хоть и принадлежащего нам) домена iframe-ом или чем то ещё, но так чтобы это делалось в фоне?
Была идея например менять цвет боди в ифрейме в зависимости от куки на чужом домене, а потом например как то прочитать канву этого ифрейма, но как это сделать не знаю, да и сомневаюсь возможно ли...

skrudjmakdak 10.11.2014 11:55

в фрейм чужого документа залазить нельзя, ибо безопасность:
<html>
	<head> 
		<title>Тестирование</title>
	</head>
	<body>
	<iframe src="http://javascript.ru/" width="200" height="200"  scrolling="yes"></iframe>
	<script>
var iframe = document.querySelector('iframe');
console.log(iframe.contentWindow.document);
	</script>
	</body>

</html>


либо в фрейме делать ссылку какую то, типа:
<iframe src="http://javascript.ru/?key_user_id=trololo" width="200" height="200"  scrolling="yes"></iframe>

Deff 10.11.2014 17:02

hated8,
Если на чужом домене фрейм ставите своим скриптом Вы, то можно передать кук в hash адреса фрейма, предварительно закодирова в encodeURIComponent

Если же наоборот, чужой док во фрейме, и у Вас нет доступа к той страницы с установкой скриптов - то дело швах,
если есть - то ставите свой фрейм, во фрейм свою ссылку с хешем, либо postMessage, либо просто XMLHTTPRequest 2 / XDomainRequest

http://javascript.ru/ajax/cross-origin-2

hated8 10.11.2014 21:04

Цитата:

Сообщение от Deff (Сообщение 340229)
hated8,
Если на чужом домене фрейм ставите своим скриптом Вы, то можно передать кук в hash адреса фрейма, предварительно закодирова в encodeURIComponent

Если же наоборот, чужой док во фрейме, и у Вас нет доступа к той страницы с установкой скриптов - то дело швах,
если есть - то ставите свой фрейм, во фрейм свою ссылку с хешем, либо postMessage, либо просто XMLHTTPRequest 2 / XDomainRequest

http://javascript.ru/ajax/cross-origin-2

postMessage - ТЕМА!!! ))) СПАСИБО! Я на него натыкался как-то но подумал что он только от parent отправляет, а оказывается и обратно можно))

hated8 16.11.2014 13:40

РАБОТА НАД ОШИБКАМИ :-/

В общем прикрутил всё это дело так:
По адресу http://site2/olduser.php страничку где работает такой пхп:
<?php
if ($_COOKIE['caught'])
	echo "<script>top.postMessage('".$_COOKIE['caught']."', '*');</script>";
	else
	echo "<script>top.postMessage('nocook', '*');</script>";
?>

На основном сайте(site1) пользователь по ходу работы сам создаёт куку "caught" в которую записывается его логин по ходу работы. Остаётся только проверить при регистрации нового пользователя на site1 есть ли у него уже кука "caught" на site2, чтобы понять новый это пользюк или перерегистрирующийся старый.
Проверяю так:
<iframe src='http://site2/olduser.php' style='display:none;'></iframe><script>
function listener(event){ itsOldUser(event.data);  } 

if (window.addEventListener)
{
   window.addEventListener("message", listener,false);
} else {
   window.attachEvent("onmessage", listener);
}
</script>

Если кука на site2 существует то выполняется функция itsOldUser('логин пользюка') если нет то itsOldUser('nocook'). nocook - отправляю чтобы запрос отправлялся один раз, т.е. если раз получил nocook то больше не вывожу этот фрейм и скрипт.

itsOldUser - по мимо прочих манипуляций по блокировки пользователя скидывает в логи информацию о том, что пользюк такой-то пытался зарегистрироваться под новым таким-то...
Попытка регистрации ("логин старый") под новым ("логин новый")

И всё замечательно работает сколько бы я не тестировал но! Примерно 10% приходят в таком виде:
Попытка регистрации ("логин старый") под новым ([object Object])
Попытка регистрации ("логин старый") под новым ({\"id\":\"2\",\"key\":\"611A400F-2627-4710-B92D-E15E616С3DF1_foss\",\"value\":null})
Попытка регистрации ("логин старый") под новым ({\"id\":\"1\",\"key\":\"fouhid\",\"value\":\"611A400F-2624-4710-B92S-E25E616B3DF1\"})

Что это такое? У нас ни на site1 не на site2 - нет таких параметров. Почему прилетает такая билиберда ели там должен быть логин или nocook? Как понять что это за пользователи(есть ли у них кука на site2?) если возвращается такая фигня?

Сколько не пытался повторить поведение этих пользователей, так и не смог получить эти результаты. Сколько не тестировал - всё нормально работает и возвращается логин или nocook... Как такое происходит и что они делают?

В общем прошу помощи...

hated8 17.11.2014 07:19

Определил что такие косяки идут с ЯндексБраузера и он почему-то исполняет listener(event) дважды, сначала как надо, а второй раз уже ы event.data в которой бодяга о чём написал выше...
Почему так?

hated8 17.11.2014 18:06

:help:


Часовой пояс GMT +3, время: 07:23.