2017-08-17 3 views
0

Ich versuche, Login-Informationen für eine Website mit curl php zu überprüfen. Request-Header sieht wie folgt aus:Wie bekomme ich Cookie in Anfrage Header während curl php

GET /loginpage.cgi HTTP/1.1 
Host: test.com 
Connection: keep-alive 
pragma: no-cache 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Accept: */* 
Referer: https://test.com/login.cgi 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.8 
Cookie: QSESSIONID=**c0da73be1917324c157e5c45b1bccd4f** 

Der QSESSIONID Wert ändert sich jedes Mal, ich diesen Wert benötigen Pässe in der Kopfzeile sein, um eine Locke Anfrage von PHP zu machen. Mein PHP-Code sieht folgendermaßen aus:

<?php 

$username = 'user'; 
$password = 'pass'; 

$url = "https://test.com/login.cgi?key=GetLoginUserInfo"; 

$ch = curl_init(); 
$headers = array(); 
$headers[] = "Pragma: no-cache"; 
$headers[] = "Accept-Encoding: gzip, deflate, br"; 
$headers[] = "Accept-Language: en-US,en;q=0.8"; 
$headers[] = "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"; 
$headers[] = "Accept: */*"; 
$headers[] = "Referer: https://test.com/login.cgi?key=UDIT"; 
$headers[] = "Cookie: QSESSIONID=c0da73be1917324c157e5c45b1bccd4f"; 
$headers[] = "Connection: keep-alive"; 
$headers[] = "Cache-Control: no-cache, no-store, max-age=0, must- 
revalidate"; 
$headers[] = "Expires: Fri, 01 Jan 1990 00:00:00 GMT"; 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
$result = curl_exec($ch); 

print_r($result); 
$ch_error = curl_error($ch); 

if ($ch_error) { 
    echo "cURL Error: $ch_error"; 
} else { 
    echo $result; 
} 

curl_close($ch); 
?> 

Jetzt, wenn ich dies ausführen. Wenn ich die Sitzungs-ID aus dem Header der dev tools-Anforderung abrufe und sie in meiner Kopfzeile ändere, kann ich mich nur anmelden, da sich der Wert jedes Mal ändert, wenn ich mich einmal anmelde.

Also meine Frage ist, ist ihre eine Möglichkeit, ich kann diesen Wert aus der Anfrage Header, so dass ich diesen Wert in meinem Header in PHP-Code anhängen kann. Oder auf eine andere Weise, die Sie vorschlagen können, bin ich offen für Vorschläge. Wenn ich diese Informationen aus PHP-Code entfernen, schlägt die Anfrage fehl, wenn

Antwort

0

Das sieht wie eine Sitzungs-ID aus (der Name gibt es weg), diese werden bei Ihrer ersten Verbindung generiert. Sie sollten dies speichern und bei nachfolgenden Anfragen als Cookie senden, damit der Server Ihre Sitzung verfolgen kann.

Wenn Sie diese Cookie-Header nicht senden, erhalten Sie eine zufällige mit jeder Anfrage.

Dieser Code wurde geschrieben, um Ihnen zu zeigen, wie Cookies gehandhabt werden. Es gibt viele Vermutungen darüber, was Sie zu tun versuchen, aber dies gibt Ihnen ein grundlegendes Verständnis darüber, wie Kopfzeilen und die Sitzungs-ID analysiert und behandelt werden.

Ich vermeide die Verwendung eines Cookiejar (der viel einfacher und sauberer zu codieren ist), weil es automatisch all dies für Sie tut, ich empfehle Ihnen, in sie zu schauen, sobald Sie erfahren, wie Session ID funktioniert.

<?php 

class MyService 
{ 

    private $headers = []; 
    private $cookies = []; 
    private $loggedIn = false; 


    function login($username, $password) 
    { 
     $ch = curl_init('https://test.com/login.cgi'); 

     #Assumption: Do whatever is needed for login here 
     curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password); 

     # This is where we setup header processing 
     curl_setopt($ch, CURLOPT_HEADERFUNCTION, [$this, 'parseHeaders']); 

     #Assumption: Check for valid response 
     $response = curl_exec($ch); 

     $this->loggedIn = ($response == 'true'); 

     curl_close($ch); 

     return $this->loggedIn; 
    } 


    function getHeader($header) 
    { 
     return array_key_exists($header, $this->headers) ? $this->headers[$header] : null; 
    } 

    function getCookie($cookie) 
    { 
     return array_key_exists($cookie, $this->cookies) ? $this->cookies[$cookie] : null; 
    } 

    function parseHeaders($ch, $header) 
    { 
     if (stristr($header, 'set-cookie')) { 

      # If you can install PECL pecl_http this will work better 
      // $this->cookies = http_parse_cookie(strstr('Set-Cookie', $header))['cookies']; 

      # Otherwise 

      $reserved_words = [ 
       'httponly', 
       'expire', 
       'path', 
       'expires', 
       'domain', 
       'secure' 
      ]; 

      preg_match("/Set-Cookie: (.*)/", $header, $cookies); 

      foreach ($cookies as $cookie) { 
       $cookie = explode(';', $cookie); 

       foreach ($cookie as $cookie_part) { 

        $cookie_part = explode('=', $cookie_part); 

        array_walk($cookie_part, create_function('&$val', '$val = trim($val);')); 

        if (!in_array($cookie_part[0], $reserved_words) && isset($cookie_part[1])) { 
         $this->cookies[$cookie_part[0]] = $cookie_part[1]; 
        } 
       } 
      } 

     } else { 

      $header_part = explode(':', $header, 2); 

      if (isset($header_part[1])) { 
       $this->headers[trim($header_part[0])] = trim($header_part[1]); 
      } 
     } 

    } 

    function otherInfo() 
    { 

     if (!$this->loggedIn) { 
      throw new NotLoggedInException('Login first'); 
     } 

     $headers = []; # Populate whatever headers are mandatory 

     $url = "https://test.com/login.cgi?key=GetOtherInfo"; 

     $ch = curl_init(); 

     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

     curl_setopt($ch, CURLOPT_COOKIE, 'QSESSIONID=' . $this->getCookie('QSESSIONID')); 

     $result = curl_exec($ch); 

     curl_close($ch); 

     return $result; 

    } 

    function getUserInfo() 
    { 

     if (!$this->loggedIn) { 
      throw new NotLoggedInException('Login first'); 
     } 

     $headers = []; # Populate whatever headers are mandatory 

     $url = "https://test.com/login.cgi?key=GetLoginUserInfo"; 

     $ch = curl_init(); 

     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

     curl_setopt($ch, CURLOPT_COOKIE, 'QSESSIONID=' . $this->getCookie('QSESSIONID')); 

     $result = curl_exec($ch); 

     curl_close($ch); 

     return $result; 

    } 

} 

$username = 'user'; 
$password = 'pass'; 

$api = new MyService(); 
$api->login($username, $password); 

$info = $api->getUserInfo(); 
$other = $api->otherInfo(); 
+0

Hallo Ollie, ich bin immer noch nicht in der Lage, die Daten zu bekommen. Um meine Frage klarer zu stellen, versuche ich, die Daten auf dieser Seite zu erhalten, die so aussehen: {"Erfolg": "true", "data": {"UserId": "user", "LoginAccess": " READ-ONLY "," ActiveUsers ":" 1 "," UserLevel ":" 3 "}," Nachricht ":" "}, aber ich erhalte Zeichenfolge (60)" {"success": "false", "data ":" "," Nachricht ":" Sitzung abgelaufen "} –

+0

Ich kann mich aber wegen der Sitzungs-ID nicht anmelden. Ich habe noch nie Sitzungen verwendet, also habe ich keine Ahnung, wie das geht. –

+0

Mit Ihrer ersten Anfrage Wenn Sie auf die Seite klicken, wird ein Header angezeigt, der einige Cookies anzeigt: Set-Cookie: QSESSIONID = c0da73be1917324c157e5c45b1bccd4f; Sie müssen dies übernehmen und dann als Cookie-Header festlegen für jede andere Anfrage an das System, einschließlich der Anmeldung. – Ollie

Verwandte Themen