PHP, cURL en DotNet from authenticication

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jozuf
  • Registratie: Augustus 2008
  • Laatst online: 02-09 11:06
Hoi allemaal,

Ik ben voor een eigen projectje wat bezig met cURL in PHP (op windows if that mathers at all).
Ik heb er wel vaker wat dingetjes mee gedaan maar vind het gewoon erg lastig altijd omdat er zoveel achter de schermen gebeurt die je moet zien en na moet bootsen. Ik heb de FF addon Live HTTP Headers al geïnstalleerd hiervoor.

Waar ik nu mee bezig ben is proberen via cURL door een DotNet form login te komen.
Ik vind het lastig en weet eerlijk gezegd ook nog niet zo goed of ik alle aspecten wel te pakken heb, aangezien ik er niet uitkom.
Wat ik denk dat er moet gebeuren (het gaat trouwens om ForTheRecord)

1) cURL naar de 4TR website, haal de viewstate en andere dotnet dingetjes op
2) Doe een post request naar de 4tr login form action (waarbij ik de login meestuur incl de viewstate etc. opgezocht in de HTML wat er allemaal word verstuurd)
3) Doe de post (stap2) met het accepteren van cookies, schrijf de cookie weg naar een file
4) Doe een setcookie met de contents van de cookie die de server heeft ontvangen. Zet de cookie op de juiste url.
5) redirect de client naar fortherecord pagina (steeds de zelfde pagina volgens mij, allemaal gericht op Main.aspx)

Ik heb al wat geschreven dat het hierboven genoemde allemaal hoort te tackelen maar natuurlijk schrijf ik dit omdat ik het maar niet werkend krijg.

Ik moet wel excuses aanbieden voor de code aangezien dit echt gewoon testen is van mij en daarbij ben ik nooit zo netjes maar als mensen een kijkje willen nemen, *Weg* (van MP forum, ook al daar gepost).

Als iemand gewoon tips heeft om dit te tackelen of hoe beter te werk te gaan dan hoor ik ze ook graag.

[ Voor 5% gewijzigd door Woy op 11-12-2009 11:17 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Dat werkt natuurlijk niet. Je kunt alleen cookies setten voor het huidige domein, niet voor een ander domein :X Het zou wat zijn als dat kon.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • jozuf
  • Registratie: Augustus 2008
  • Laatst online: 02-09 11:06
ja ok dat snap ik maar het is het huidige domein (vind ik :)).
Alhoewel het niet dezeflde poort is.
Volgens mij word het dan wel aangemerkt als ander domein?

het gaat allemaal om het domein wat gekoppeld is aan mijn homeserver. Draai IIS en apache op verschillende poorten, 4TR draait op IIS

met "zet cookie op de juiste url" bedoel ik meer dat het naar de juiste map verwijst dus;
cURL script request van client gaat naar

:80/eenpad/curl (dat :80 laat ik uiteraard weg, overbodig, maar ff voor duidelijkheid)

en curl doet

:anderepoort/ForTheRecord.WebAccess


-----EDIT----

denk dat het idd niet kan, dan maar oplossing 2 (die ik net bedenk), aspnet_module gebruiken voor apache en fortherecord op apache draaien. IIS is toch waardeloos :)
Maar weet iemand of een andere poort als andere domein word aangemerkt? Goed om te weten dan, volgens mij nml niet aangezien ik ook wel is met utorrents webui bezig ben geweest hiervoor. Dit draait op nog een andere poort en hierbij lukte me het ook altijd maar gedeeltelijk (kreeg wel iets voor elkaar maar nog niet werkend)

[ Voor 93% gewijzigd door jozuf op 11-12-2009 11:14 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik snap nog steeds niet wat je probeert te doen. Als je nou eens begint met dat te vertellen? :) Ik lees iets over Apache, IIS, PHP en ASP.NET, dat is allemaal heel interessant, maar wat wil jij nu bereiken?

Je wil op de achtergrond een inlogformulier van een andere site opvragen. Dat kan. Je wil vervolgens inloggen volgens dat formulier door POST-velden in te vullen en terug te sturen, dat kan ook. Daarna wil je de cookies uit het antwoord van de oorspronkelijke site setten op jouw site, en de bezoeker doorverbinden naar de tweede site, met daarbij de cookies die jij in je script hebt opgevraagd? Dat kan niet.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb al wat geschreven dat het hierboven genoemde allemaal hoort te tackelen maar natuurlijk schrijf ik dit omdat ik het maar niet werkend krijg.
Vertel dan ook concreet wat er niet werkt zoals je verwacht. Op deze manier lijkt het erg op een "Willen jullie even mijn code debuggen".

In je topic start geef je al mooi aan welke stappen je denkt te moeten nemen. Dan ga je dus per stap bekijken wat er allemaal gebeurt en of dat is wat je verwacht. Op een gegeven moment kom je dan op een punt dat er iets anders gebeurt dan wat je verwacht had en dan kun je je daar op focussen.

Verder is het niet de bedoeling dat je hier een zipje plaatst met je complete code erin. Wat we wel fijn vinden is als je hier relevante stukjes code in je post opneemt, die demonstreren wat je probeert te doen, en wat daar niet mee wil lukken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jozuf
  • Registratie: Augustus 2008
  • Laatst online: 02-09 11:06
Ik snap de verwarring, probeer zo duidelijk mogelijk te zijn.

Mijn probleem is vooral dat ik gewoonweg in de functie waarnaar ik verwijs (het bestandje, wat al een extractie is van een klasse, lelijke code nog) niet weet wat er fout gaat.

Ik denk dat CodeCaster gewoon gelijk heeft en dat door de poort wijziging de cookie niet geaccepteerd word.

Voor de duidelijkheid alles gebeurt op dezelfde server. De curl gaat naar dezelfde server (maar dus op een andere poort dan waar hij vandaan request). De poort wijziging doet het hem denk ik.

Wat ik nu voor elkaar heb met curl is een onsuccesvolle inlog. Dus ik krijg gewoon leuk weer het inlog scherm te zien. Terwijl cURL wel door de inlog is gekomen, de cookie word ook juist gezet op de server.

Ik weet nog niet hoe het zit met de cookie uiteindelijk op de client.
Als ik met live http headers kijk zie ik zo ongeloofelijk veel voorbij komen dat ik door de bomen het bos een beetje kwijt raak.
De aspnetsession id staat netjes in de cookie lijkt het.

---EDIT---

Code wat opgeschoont dus nog maar ff plaatsen dan.
Dit script draait dus op dezelfde some.uri maar dan op poort 80 ipv 1122 (onzin poort, is iets anders)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    public function fortherecord(){
        $port = 1122;
        $url = 'http://some.uri:' . $port . '/ForTheRecord.WebAccess/Main.aspx';
        $reffer = 'http://some.uri:'. $port . '/ForTheRecord.WebAccess/Main.aspx';
        $agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
        $cookie_file_path = 'eenpad\fortherecord_autologin.txt'; 
        
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
        curl_setopt($ch, CURLOPT_PORT,$port); 
        
        $result = curl_exec($ch);
        $startPos = strpos($result, 'value=') + 7;
        $viewstate = substr($result, $startPos, strpos($result, '"', $startPos) - $startPos);

        $startPos = strpos($result, $search = 'id="__EVENTVALIDATION" value="') + strlen($search);
        $eventvalidation = substr($result, $startPos , strpos($result, '"', $startPos) - $startPos);
        
        
        $postfields  = '__Panels_LogonPanel.ascx$UserNameTextBox=user&';        //Username
        $postfields .=  '__Panels_LogonPanel.ascx$PasswordTextBox=pass&';       //Password
        $postfields .=  '__Panels_LogonPanel.ascx$LogonButton=Inloggen&';       //Waarschijnlijk niet nodig
        $postfields .=  '__EVENTTARGET=&';                                      //Geen idee?
        $postfields .=  '__ASYNCPOST=true&';                                    //Geen idee?
        $postfields .=  'MainScriptManager=ContentUpdatePanel|__Panels_LogonPanel.ascx$LogonButton&';   //Geen idee?
        $postfields .=  '__EVENTARGUMENT=&';                                    //Geen idee?
        $postfields .=  'HiddenPopupCommandName=&';                             //Geen idee?
        $postfields .=  'HiddenEpgScrollTop=&';                                //Geen idee?
        $postfields .=  'HiddenPopupCommandName=ContentUpdatePanel|__Panels_LogonPanel.ascx$LogonButton&'; //Geen idee?
        $postfields .=  '__VIEWSTATE=' . $viewstate . '&';
        $postfields .=  '__EVENTVALIDATION=' . $eventvalidation;

        curl_close($ch);
        
        $ch = curl_init();          
        #curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        #curl_setopt($ch, CURLOPT_HEADER,1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        #curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_REFERER, $reffer);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
        curl_setopt($ch, CURLOPT_PORT,$port); 
        curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: application/x-www-form-urlencoded"));
        
        #curl_setopt($ch, CURLOPT_VERBOSE, 1); 
        
        $result = curl_exec ($ch);

        curl_close ($ch); 
        
        $aspSessionID = trim(substr($cookie = file_get_contents($cookie_file_path), strpos($cookie, $string = 'ASP.NET_SessionId') + strlen($string)));
        setcookie('ASP.NET_SessionId', $aspSessionID , time()+3600, '/');
        $this->content = str_replace('<head id="Head1">', '<head id="Head1"><base href="http://some.uri:8080/ForTheRecord.WebAccess/" />', $result); 
    }

[ Voor 189% gewijzigd door jozuf op 11-12-2009 12:16 ]


Acties:
  • 0 Henk 'm!

  • jozuf
  • Registratie: Augustus 2008
  • Laatst online: 02-09 11:06
KICK.

Niemand die hier mee kan helpen?
Of is het gewoon niet mogelijk?
Pagina: 1