PDA

Просмотр полной версии : Генерация Cookie


Hwma
20.08.2009, 23:14
Привет, подскажите каким образом может генерироваться кукис при авторизации на сайте? Пишу прогу, которая будет логиниться на сайт и парсить некоторую инфу. По шагам:
Логинюсь на сайт, параллельно смотрю снифером какие заголовки и POST данные передаются.
Делаю POST запрос на сайт с абсолютно точно такими же заголовками и POST данными, но в ответ получаю какие-то "неправильные" кукисы, которые естественно сервер не принимает и не авторизовывает.
Для примерна, когда логинюсь браузером, то получаю вот такие кукисы:
Cookie: VID=1ZCdjS2_76Wg; p=KOwIAeHL3wAA; mrcu=42E54A40A8FF25C7518F4B70A753; t=obLD1AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABAAABAAAAAAAAAACAAAEEvAcA; client_res=1280x1024; searchuid=2679434291245682884; bf=SGGGGdsLmTb6Sfszd9hbTBZG7DbrPi4BzmPEYD9HMIs8ZK1 xqBJ*GwtwFDeDsUcWbXIvd0FEGqXymy8ycpHt4H8X; cf=eGGGGdsLvmwgPEI0FN0AtyaIEHiPEYIxKYISGg2HpBmebP; c56=QJSVSgAAAALaHQEAAAAAAyc4AQAAAAAA; c8=QKuNSgAAAAMhDwMAAAAAAqfdBQAAAAADAWwCAAAAAAKgDgI AAAAAApF6AQAAAAADAW4CAAAAAAK6TAEAAAAAAv3nAgAAAAAB+ VIBAAAAAAMf+wEAAAAAAmAiAQAAAAADAW0CAAAAAAIw+wIAAAA AAkNEAQAAAAADJ5sCAAAAAAMTYAEAAAAAAyYWAQAAAAAA; partnerid=st; server=1; PHPSESSID=c8f0f3ebdd3633f94e7d9036b9888e3b; uid=629497

После посылки пост запроса программой, мне возвращаются вот такие кукисы:
Cookie: PHPSESSID=3a1f2ff253ae09ac4767007627141d0d; path=/,Mpop=1250794471:5a0f6b4205524a5e190502190a1d00071 c02074f6a5d5e465e070408071d030e03185f505f5156516e4 4505550105d595b5e48184a47:*****@inbox.ru:; expires=Wed, 18-Nov-2009 18:54:31 GMT; path=/; domain=.***.ru,server=1; expires=Sat, 22-Aug-2009 18:54:28 GMT; path=/; domain=.***.***.ru,uid=629497; path=/

В первом кукисе есть вот такой вот кусочек: "client_res=1280x1024". То есть кукисы как-то редактируются толи жабаскриптом, толи хз как. И вот собственно вопрос, как можно получить нормальный кукис ?

Kaimi
20.08.2009, 23:21
Где конкретно авторизоваться пытаешься?

Hwma
20.08.2009, 23:36
Я про что и говорю. Хочу разобраться как эти данные попадают в кукисы

Pashkela
20.08.2009, 23:38
Определяются серверным скриптом + javascript скорее всего и потом прописываются в куки после авторизации, причем здесь пост запрос, от человека будут требовать в пост запросе его разрешение экрана? Смешно

Hwma
20.08.2009, 23:40
Каким образом можно узнать эту инфу, которая записывается в кукисы и передать ее серверу, чтобы он ее принял?

Hwma
20.08.2009, 23:45
Да разрешение это фигня, там тем более в передаваемом заголовке Cookie еще много чего непонятно откуда взявшегося, например mrcu

попугай
21.08.2009, 00:08
Шлешь на сервак запрос для авторизации с паролем и логином - в ответ получаешь куки, и далее все запросы на сервак шлешь вместе с этими куками

Pashkela
21.08.2009, 00:10
Шлешь на сервак запрос для авторизации с паролем и логином - в ответ получаешь куки, и далее все запросы на сервак шлешь вместе с этими куками


Ага, полностью согласен, два запроса, первый - авторизация и получение кук, второй - поход на нужную страницу, и не париться, откуда и что тебе в куки вставляют, просто получить

Вот пример авторизации на ачаде, именно этот пример показывает, что нам пофигу, что там в куки пишется и откуда это берется:


<?php
$user = 'Pashkela';
$pass = md5('лолохоцкер123$!#--?');
// Раззззз.......
$cl = curl_init('http://forum.antichat.ru/login.php?vb_login_username='.$user.'&vb_login_password=&cookieuser=1&s=&do=login&forceredirect=1&vb_login_md5password='.$pass);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl, CURLOPT_USERAGENT, 'Opera/9.25 (Windows NT 5.1; U; ru)');
curl_setopt($cl, CURLOPT_REFERER, 'http://forum.antichat.ru/');
curl_setopt($cl, CURLOPT_HEADER, 1);
curl_setopt($cl, CURLOPT_COOKIEJAR, 'coockie.txt');
$ex = curl_exec($cl);
curl_close($cl);
// Два......
$exec = curl_init('http://forum.antichat.ru/index.php');
curl_setopt($exec, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($exec, CURLOPT_USERAGENT, 'Opera/9.25 (Windows NT 5.1; U; ru)');
curl_setopt($exec, CURLOPT_REFERER, 'http://forum.antichat.ru/');
curl_setopt($exec, CURLOPT_HEADER, 1);
curl_setopt($exec, CURLOPT_COOKIEFILE, 'coockie.txt');
$page = curl_exec($exec);
curl_close($exec);
preg_match('#<div class="bigusername">(.*)</div>#',$page,$username);
preg_match('#\(<b>(.*)<\/b>\/(.*)\)#',$page,$messg);
echo 'У пользователя <b>'.$username[1].'</b>&nbsp;&nbsp;'.$messg[0].'&nbsp;сообщений.';
?>


зачем создавать отдельную тему - непонятно, таких вопросов миллион (как и ответов) по форуму

Hwma
21.08.2009, 00:19
Это все понятно. Только дело то в том, что ответный заголовок вот такой: Set-Cookie=PHPSESSID=40780ed9fa61684efd11155f5d35174d; path=/
server=1; expires=Sat, 22-Aug-2009 19:51:37 GMT; path=/; uid=629497; path=/
а дальше на сервер посылаются заголовки с кукисами, где от ответного заголовка только PHPSESSID и uid (как видно из первой цитаты первого поста), и куча параметров которые беруться непонятно откуда, видимо яваскриптом, но среди всех яваскриптов, которые я там увидел, яваскрипта, который хотябы будет разрешение брать я не нашел, кроме счетчика, или скрипта который будет изменять кукисы: document.cookie

Pashkela
21.08.2009, 00:22
Уже заддосили:))


Ведутся работы, ориентировочное время окончания работ 01:30 (GMT +03:00) по московскому времени.


как заработает - наверное таки напишут

qBiN
21.08.2009, 00:34
зачем создавать отдельную тему - непонятно, таких вопросов миллион (как и ответов) по форумуВы вопроса не догоняете видимо. Кароче смысл - во многих крупных проектах авторизация не так проста как кажется, благодаря js, который дает дополнительные параметры для создания сессии, и соответственно логин без них не проходит.Например данные передаются аяксом(каждый раз могут быть уникальными(соответственн 2 раза их послать уже нельзя). Столкнулся с этой проблемой сам, не так давно.
Вообщем сразу к решению:
1) Если парсер пишешь(ну или что ты там делаешь) под один проект, то можно рассматривать джаваскрипты, как они создают эти уникальные ключи, куда отсылают и прочее. Однако часто они обфускации подлежат, да и криптуют + сжимают, что разобраться с ними порой не выгодно. Овчинка выделки не стоит, как говорят. Тогда на этот случай есть 2 решение.
2) Решение 2, юзать готовые браузеры,т.к. в них есть js, причем их DOM полюбому поддерживает проект. Здесь тоже куча вариантов, берешь IE или gecko движек и вперед.Но тут уж скриптами не обойдешься.

Gifts
21.08.2009, 02:12
2TC Учите пхп, в нем все написано, это для 2 сервера, с небольшими изменениями будет работать и с первым:
//===================================
$login='логин';
$pass='пароль';
//===================================

@set_time_limit(0);
@ini_set("max_execution_time", 0);

$cookie=array();

function post($url='',$content='',$referer='')
{
GLOBAL $cookie;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
if (!empty($cookie)) curl_setopt($ch, CURLOPT_COOKIE, implode('; ',$cookie));
if (!empty($content)) {curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $content);} else {curl_setopt($ch, CURLOPT_POST, 0);}
if (!empty($referer)) curl_setopt($ch, CURLOPT_REFERER, $referer);

$ss=curl_exec($ch);
curl_close($ch);
if (preg_match_all('#^Set-Cookie: (([^;=]+)=([^;=\r\n]+))#mi',$ss,$cook))
{
if ($tmpcookie=array_combine($cook[2],$cook[1]))
$cookie=(array)$tmpcookie + (array)$cookie;
}
return $ss;
}
post('http://g2.botva.mail.ru/login.php','server=2&email='.urlencode($login).'&email2=mail.ru&passWord='.urlencode($pass).'&b_msg_go2.x=47&b_msg_go2.y=27&main=','http://g2.botva.mail.ru/index.php');
echo post('http://g2.botva.mail.ru/index.php');


qBiN То что один человек сделал - другой завсегда сломать сможет. А полагаться на яваскрипты - это терять многих пользователей, кто ими не пользуется

Pashkela
21.08.2009, 02:34
В данном сабже про яваскрипты чушь. Вот рабочий скрипт авторизации на ботве на основании мною вышесказанного:


<pre>
<?
@set_time_limit(0);
@ini_set("display_errors","1");

$mail = ''; // Ваша почта на mail.ru, всё, что до @mail.ru
$pass = '';// Пароль от почты
// Раззззз....... АВТОРИЗАЦИЯ
$cl = curl_init('http://g2.botva.mail.ru/login.php');
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($cl, CURLOPT_POST, 1);
curl_setopt ($cl, CURLOPT_POSTFIELDS, "server=2&email=$mail&email2=mail.ru&passWord=$pass&submit.x=94&submit.y=14");
curl_setopt($cl, CURLOPT_USERAGENT, 'Opera/9.25 (Windows NT 5.1; U; ru)');
curl_setopt($cl, CURLOPT_REFERER, 'http://g2.botva.mail.ru/index.php');
curl_setopt($cl, CURLOPT_HEADER, 1);
curl_setopt($cl, CURLOPT_COOKIEJAR, 'coockie.txt');
$ex = curl_exec($cl);
curl_close($cl);
// Два...... ИДЁМ НА ЛЮБУЮ СТРАНИЦУ САЙТА, НО УЖЕ АВТОРИЗОВАННЫЕ
$exec = curl_init('http://g2.botva.mail.ru/tour.php');
curl_setopt($exec, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($exec, CURLOPT_USERAGENT, 'Opera/9.25 (Windows NT 5.1; U; ru)');
curl_setopt($exec, CURLOPT_REFERER, 'http://g2.botva.mail.ru/login.php');
curl_setopt($exec, CURLOPT_HEADER, 1);
curl_setopt($exec, CURLOPT_COOKIEFILE, 'coockie.txt');
$page = curl_exec($exec);
curl_close($exec);
echo $page;
?>
</pre>


ну и Gifts риспект, впрочем как и всегда (практически тоже самое, только оформленное в виде функции с небольшими изменениями в алгоритме)

PS: Какие куки вы в итоге получили всегда можете посмотреть в файле, который создается автоматически в той же папке, где был запущен сам скрипт - coockie.txt

все необходимые данные элементарно цепляются из tamper data (плагин для FireFox), что было уже озвучено выше.

Итог: обычнейшая авторизация, ничем вообще не отличающаяся по сложности от авторизации на ачаде.

Приведен пример авторизации на сервере g2, так как не мог зарегица на сервере g1, потому что он официально работает только до 1 ноября 2008 года.

qBiN
22.08.2009, 16:47
А полагаться на яваскрипты - это терять многих пользователей, кто ими не пользуетсяЯхуу, всмысле yahoo.com посмотрю как ты настройки ящика будешь менять без js. Хороший пример я думаю.

qBiN
22.08.2009, 17:17
Я бы посмотрел на код JS, который нельзя перевести к примеру на phpперевести можно, но затратно. Долго пример искать не хочу, вот пример обфускованого кода, правда он тут не закодирован escape`ами и прочим. http://l.yimg.com/d/lib/bc/bc_2.0.4.js скрипт самый маленький, который нашел)

qBiN
22.08.2009, 18:08
Смысл его переводить?
ну если ты не заметил, то этот скриптик используется для передачи данных о пользователе картинке по урлу http://us.bc.yahoo.com/b
там всё просто - заменить пхп эквивалентами и выдрать двиг.... ну иногда ещё можно обфусцированные выражения просто заменить 1 строкойвот это вообще не понял, что ты написал.
---
Это кажется все просто, пока не начнешь работать с этим.

qBiN
22.08.2009, 20:24
если картинка как-то влияет на авторизация, то просто скопировать передаваемые данные и каждый раз их посылатьА теперь читаем вышекаждый раз могут быть уникальными(соответственн 2 раза их послать уже нельзя)
--
ну и народ пошел

qBiN
22.08.2009, 23:03
если что-то разное, то легко смотрится часть кода и добавляется в отсылку данных

base64 + md5(pass + md5(sess))ахаха) это js)))
--
Закончил оффтоп.