[IE] JS, PHP - получение чужой куки

uncle17

Есть:
- homedomain, на котором проводится авторизация
- targetdomain, на котором нужно узнать, залогинен ли человек на homedomain
Грубо говоря, нужен механизм наподобие кнопки recommend у VK, FB и прочая.
на targetdomain создается iframe, в который грузится скрипт с homedomain, который выдает в iframe свою куку (тот же PHPSESSID, к примеру).
FF, Chrome вполне нормально ее отдают, и я могу видеть на targetdomain, кто я на homedomain.
IE же в силу политик безопасности по дефолту ее не отдает. Safari, насколько я прочитал, тоже, но еще не пробовал.
Для IE существует способ с обманом third-party cookies при помощи явного указания
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

Для Safari существует способ на основе подгрузки результата скрипта в iframe не сразу, а POST-запросом из родителя (при POST-запросе, вроде как, куку кроссдоменно отдать можно).
Но с IE что-то не выходит... Точнее, как мы заметили, выходит, если на странице homedomain перед авторизацией выскакивает вконтактовская авторизация (сама по себе, виджет ВК тоже стоит на странице). Пытались понять, что они там такое инициализируют, что _наша_ кука начинает отдаваться кроссдоменно в IE. Так и не можем найти.
Какие есть мысли или как еще можно реализовать?

zorin29

я бы отказался от ифрейма вообще, и делал бы так:

<script type="text/javascript" src="http://home.domain/IsUserAuthorizedScript"></script>

На сервере (PHP не знаю, напишу на ASP.NET):

public ActionResult IsUserAuthorizedScript
{
if (User.IsAuthenticated)
return Content("var authorized=true;");
return Content("var authorized=false;");
}

Тебе ведь не нужна сама кука, а нужен факт залогинен/не залогинен?

elenangel

Тебе ведь не нужна сама кука, а нужен факт залогинен/не залогинен?
залогинен/не залогинен на этом компьютере, а не в системе вообще.

uncle17

в итоге кука не нужна, нужна инфа, взятая по этой куке.
Но кука тому скрипту в IE не отдается, а факт залогинивания отслеживается как раз по ней. Следовательно,

$user = new user;
echo $user->data[IDUser];
echo $user->is_user;

отдаст пустую строку и false. В общем-то, путей, как получить данные, полно. Но куку скрипт на homedomain в IE не отдает. Точнее, различными изжопствами и инструментами для разработчиков мы увидели, что она ЕСТЬ, но скрипту не отдает.
Можно было бы отдавать session_id гетом, но где ж его взять на стороннем домене.
В общем, такие способы мы уже пробовали - в FF, Chrome и Opera всё ок, в IE/Safari - вот так. Интересно, как это поборото у VK/FB

zorin29

Что значит "в системе вообще"? Мне кажется, кому-то из нас следует почитать про организацию сессии / авторизации в HTTP через cookies.

zorin29

Но кука тому скрипту в IE не отдается
Эту фразу не понял.
Ты хочешь сказать, что когда IE обращается к http://homedomain/someaddress, он не прикладывает нужную cookie, хотя она в браузере сохранена?
Или что-то другое?

uncle17

именно
Если обращение к homedomain идет с targetdomain, то он ее не отдает.

zorin29

спасибо, благодаря тебе я просветился :)
Вот смотри, что я нагуглил: http://www.softwareprojects.com/resources/programming/t-how-...
Последний абзац:
One Thing to Watch Out For
There is one small problem with the above output that curl generated. It really is not hard to solve but can take a little bit to find if you don't know to look for it. The problem is the cookie is generated before the Privacy Policy. Which means that Internet Explorer will reject the cookie because at the time the cookie is being created the browser has not yet received the privacy policy. The only thing that needs to be done to fix this issue is move the P3P header code to be output before the cookie generation code.
Возможно, это как раз твой случай? Впрочем, я пока не очень понял, что там происходит.

uncle17

да, я как раз про P3P писал в самом начале
Но послать P3P-заголовок _до_ setCookie при запросе что яваскрипта, что результатов в iframe возможным не представляется.
Можно было бы сделать через сокеты, но опять же - куки тогда надо установить самому, а со стороннего домена я ее не узнаю.
фуф... осталось полтора дня

uncle17

http://homedomain/foo.php

<?
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');
header('Content-type: text/javascript');
echo('document.getElementById("IDUser").innerHTML = "'.$_COOKIE[PHPSESSID].'";');
?>

http://targetdomain/iframe.php

<?
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');
?>
<!DOCTYPE html>
<html>
<head>
<title>trololo</title>
</head>
<body>
<div id="IDUser"></div>
<script src="http://homedomain/foo.php"></script>
</body>
</html>

FF: c50c174df9de3516bbd5f6e33d295d13
IE: пусто

zorin29

а попробуй так:

<!DOCTYPE html>
<html>
<head>
<title>trololo</title>
</head>
<body>
<div id="IDUser"></div>
<script src="http://homedomain/foo1.php"></script>
<script src="http://homedomain/foo.php"></script>
</body>
</html>

Моя задумка - что при первом запросе IE не отправит куку, но получит P3P. А при втором - отправит куку.
foo1.php назвал, чтобы исключить кеширование. foo1 - тот же скрипт, что и foo.

uncle17

неа:(

zorin29

тогда сдаюсь :(

zorin29

кстати, пробовал вместо <script> ставить iframe? может, этот p3p их по-разному интерпретирует?..

uncle17

Всё работает как надо, если выставить в настройках минимальную конфиденциальность
попробовал iframe еще раз - то же самое
p3p выставил на максимальный прием всего, используя http://www.webentrust.com/p3ptools/compact/builder.html

zorin29

попробуй помониторить все HTTP запросы и найти, как вконтакту удается пролезать в эти рамки.

Werdna

Ифреймы нафиг сразу, нет никакого способа из ифрейма смотреть на основную страницу и наоборот. Для того они и сделаны, собставенно.
Использовать для передачи надо кросс-доменный js. Делается это примерно так.
Пусть у тебя страничка example.com/1.html, там заводишь функцию poluchit_sekritik(sekretik)
Потом вставляешь js из другого домена, которая делает такой вызов: poluchit_sekretik('erwhjhgwerkjwgfeurgfkwehjgerhjwgferhjw')
а сама функция уже сходит куда надо и по такому секретику уже получит что угодно.
Если не понятно объяснил, пиши приватик. Или читай как кнопки ВК и БФ работают, это всё одно и то же.

Bibi

не очень понятно, нужно ли разрешить такое поведение только с targetdomain. если ограничения нет, то я бы делал через jsonp

uncle17

targetdomain может быть абсолютно любым
Как уже писалось, нужна система, аналогичная recommend у VK/FB/etc.
JSONP я начинал читать, но в подробностях мы пока не осиливали и не факт, что получится (серверная платформа старая, возможно, кучу уже написанного кода придется писать под старый PHP)

Bibi

осильте, php не роляет.

zorin29

а как jsonp решит проблему, что IE не прикладывает куку к <script src=""> запросу к другому домену?

Trofimovyoa

А что, передать данные не в куках, а в строке GET запроса нельзя?

serega1604

данные о том, что пользователь залогинен на чужом сайте? проблематично.

Bibi

прикладывает

zorin29

Месье не читал тред? Напрасно, рекомендую прочесть.

Bibi

месье знает, что контекстная реклама работает в ie

Dasar

месье знает, что контекстная реклама работает в ie
контекстная и конкретно-человеко-ориентированная - это не одно и тоже..
для первого, куки в скрипте не нужны, для второго тоже, если используется iframe

zorin29

Так я согласен, но у Федечки проблема как раз в том, что он не может продублировать функциональность контекстной рекламы из-за того, что ие не прикладывает куки.
Оставить комментарий
Имя или ник:
Комментарий: