tutorials.de Buch-Aktion 05/2012
Like Tree5Danke
  • 1 Beitrag von Sven Mintel
  • 1 Beitrag von Sven Mintel
  • 1 Beitrag von Sven Mintel
  • 1 Beitrag von Sven Mintel
  • 1 Beitrag von Sven Mintel
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
901
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Moin Jungs,

    also ich habe ein kleines Problem. und zwar möchte ich von der Seite meines Kumpel News auslesen. Dazu muss ich allerdings in einen geschützten Bereich. So nun habe ich das Anmeldeformular auf seiner Seite ausgeführt. Wie kann ich jetzt das Cookie auf dem Server speichern, so das dieser dann testweise die seite zum Client schicken kann ohne das dieser sich nochmals anmelden muss.

    Hier mal die klasse, die Verbindung herstellt und das Formular ausfüllt

    PHP-Code:
    <?php

    /**
     * @author Kai Dölger
     * @layout NewsBot
     * @date 17.02.2010 - 13:05
     */
     
     
    $ob = new bot();
     
     
     class 
    bot
     
    {
        function 
    bot ()
        {
            
    $this->login_use();
        }
        
        function 
    login ($host$path$referer$data_to_send)
        {
            
    $fp fsockopen($host80);
            
    printf("Open!\n");
            
    fputs($fp"POST $path HTTP/1.1\r\n");
            
    fputs($fp"Host: $host\r\n");
            
    fputs($fp"Referer: $referer\r\n");
            
    fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
            
    fputs($fp"Content-length: "strlen($data_to_send) ."\r\n");
            
    fputs($fp"Connection: close\r\n\r\n");
            
    fputs($fp$data_to_send);
            
    printf("Sent!\n");
            while(!
    feof($fp))
            {
            
    $res .= fgets($fp128);
            }
            
    printf("Done!\n");
            
    fclose($fp);
            return 
    $res;
        }
        
        function 
    login_use ()
        {
            
    $data "loginName=*****&pass=******";
     
            
    printf("Go!\n");
            
    $x $this->login(
                  
    "**************",
                  
    "/index.php",
                  
    "******************",
                  
    $data);
            
    $content = require("*********/index.php");
            
    printf($content);
        }
        
        function 
    getNews ()
        {
        
        }
     }

    ?>
     

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    Cookies werden ja im Browser und nicht auf dem Server gespeichert.

    Was du tun müsstest wäre dies:
    was die Funktion login() zurückgibt erstmal durchsuchen nach dem Wert des betreffenden Cookies(wie der Name des Cookies ist, weisst du ja, nehme ich mal an).

    Diesen Wert musst du dir merken und beim nächsten mal den Cookie in der Anfrage mit übermitteln, das sollte dann ca. so aussehen:

    Code :
    1
    2
    3
    4
    5
    
            $fp = fsockopen($host, 80);
            fputs($fp, "GET [I]/loginerforderndeNews.php[/I] HTTP/1.1\r\n");
            fputs($fp, "Host: $host\r\n");
            fputs($fp, "Connection: close\r\n");
            fputs($fp, "Cookie: [I]namesDesCookies=wertDesCookies[/I]\r\n\r\n");
    KGD92 bedankt sich. 

  3. #3
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Zitat Zitat von Sven Mintel Beitrag anzeigen
    Moin,

    Cookies werden ja im Browser und nicht auf dem Server gespeichert.
    Richtig, aber in dem Moment wo mein Server die News beim anderen Server abfragt wird der ja zum Client

    Also eigentlich wollte ich die Daten aus dem Cookie dann in ner DB speichern, aber das ist ja im Moment nicht mein Problem

    Zitat Zitat von Sven Mintel Beitrag anzeigen

    Was du tun müsstest wäre dies:
    was die Funktion login() zurückgibt erstmal durchsuchen nach dem Wert des betreffenden Cookies(wie der Name des Cookies ist, weisst du ja, nehme ich mal an).

    Diesen Wert musst du dir merken und beim nächsten mal den Cookie in der Anfrage mit übermitteln, das sollte dann ca. so aussehen:
    Wie ich den Wert übermittle ist mir klar, mein Problem ist wie komme ich an den Wert ran? Beispiel siehe Anhang

    Danke schonmal
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Externes Formular ausführen und cookie speichern-cookie.png  
     

  4. #4
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    So zum Beispiel:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
        function login_use ()
        {
            $data = "loginName=*****&pass=******";
     
            printf("Go!\n");
            $x = $this->login(
                  "**************",
                  "/index.php",
                  "******************",
                  $data);
    [COLOR="Blue"][B]             preg_match('@PHPSESSID=([\da-f]{32})@,$x,$sid);
                 //in $sid[1] sollte jetzt die Session-ID stehen[/B][/COLOR]
     
            $content = require("*********/index.php");
            printf($content);
        }
    KGD92 bedankt sich. 

  5. #5
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Alles klar, werde es morgen gleich mal ausprobieren, DANKE

    Kai
     

  6. #6
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Also erstnochmal ein großes Danke an Sven.

    So nun weis ich nicht ob ich einfach zu blöd bin oder mir meine PHP Kenntnisse hier an ihre Grenzen stoßen. Nun habe ich mich angemeldet und will nun den Content aus dem geschützten Breich auslesen. Allerdings klappt das nicht so ganz Das ganze sollte in der Funktion getNews() passieren, tut es aber leider nicht

    Hier die Klasse
    PHP-Code:
    <?php

    /**
     * @author Kai Dölger
     * @layout Project1
     * @date 17.02.2010 - 13:05
     */
     
     
    $ob = new bot();
     
     
     class 
    bot
     
    {
     
        var 
    $session;
        var 
    $serverid;
     
        function 
    bot ()
        {
            
    $this->login_use();
            
    $this->getMessages();
        }
        
        function 
    login ($host$path$referer$data_to_send)
        {
            
    $fp fsockopen($host80);
            
    printf("Open!\n");
            
    fputs($fp"POST $path HTTP/1.1\r\n");
            
    fputs($fp"Host: $host\r\n");
            
    fputs($fp"Referer: $referer\r\n");
            
    fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
            
    fputs($fp"Content-length: "strlen($data_to_send) ."\r\n");
            
    fputs($fp"Connection: close\r\n\r\n");
            
    fputs($fp$data_to_send);
            
    printf("Sent!\n");
            while(!
    feof($fp))
            {
            
    $res .= fgets($fp128);
            }
            
    printf("Done!\n");
            
    fclose($fp);
            return 
    $res;
        }
        
        function 
    login_use ()
        {
            
    $data "loginName=******&pass=********";
     
            
    printf("Go!\n");
            
    $x $this->login(
                  
    "**********************",
                  
    "/start.php",
                  
    "*****************************",
                  
    $data);
            
    preg_match('@PHPSESSID=([\da-f]{32})@',$x,$sid);
            echo  
    "<br />Cookie SessionID: ".$sid[1];
            
    $this->session $sid[1];
        }
        
        function 
    getNews ()
        {
            
    $fp fsockopen("*******"80);
            
    fputs($fp"GET /start/index.php HTTP/1.1\r\n");
            
    fputs($fp"Host: ************* \r\n");
            
    fputs($fp"Connection: close\r\n");
            
    fputs($fp"Cookie: PHPSESSID=".$this->session." \r\n\r\n");
            while ( ! 
    feof$fp ) ) 
            { 
                
    $inhaltfread($fp80); 
            }
            
            echo 
    "<p>".$inhalt."</p>";
        }
     }

    ?>
    Ich bekomme jetzt folgende Ausgabe
    Code :
    1
    2
    3
    4
    
    Go! Open! Sent! Done! 
    Cookie SessionID: 64caa3cb09b8704e70a09e3d9d63a20c
     
    : 0 Connection: close Content-Type: text/html

    Allerdings wollte ich den HTML Code haben in der unteren Zeile. Ich hoffe ihr habt Geduld mit mir und helft mir ein weiteres mal aus der Klemme. DANKE
     

  7. #7
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Du liest da nur 80 Zeichen pro Zeile:

    Code :
    1
    
    $inhalt= fread($fp, [B]80[/B]);
    das ist vermutlich etwas wenig.
    KGD92 bedankt sich. 

  8. #8
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Okay, danke, dann hab ich die Zahl etwas missinterpretiert Werde mal schaun was passiert wenn ich sie vergrößere

    BESTEN DANK

    So hab das ganze mal auf 250 Zeichen erhöht. Dann erhalte ich folgende Ausgabe

    Code :
    1
    2
    3
    4
    
    Go! Open! Sent! Done!
    Cookie SessionID: 0f5a0b459b4e3e4c8291e9bc227f1bf8
     
    st-check=0, pre-check=0 Pragma: no-cache Location: / Content-Length: 0 Connection: close Content-Type: text/html

    Dann habe ich die Zahl weiter auf 1000 erhöht und ich bekam gar keine Ausgabe mehr.

    Also jetzt bin ich leicht verwirrt !? PS: Bei Content-Length sollte aber eigentlich auch nicht "0" stehen, oder?

    Grüße Kai
    Geändert von KGD92 (19.02.10 um 14:06 Uhr)
     

  9. #9
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Das lässt sich eigentlich recht schwer sagen, woran es hapert...wenn man die Gegenseite nicht kennt(vielleicht wird dort ja noch mehr erwartet zum Login).

    Hier mal ein funktionierendes Beispiel:
    PHP-Code:
    <?php

     
    class bot
     
    {
     
        var 
    $auth,
            
    $sessionID;
        
     
        function 
    bot(
                      
    $host
                      
    $loginPath,
                      
    $loginMethod,
                      
    $loginData
                      
    $loginReferer,
                      
    $loginContentType,
                      
    $sessionName
                    
    )
        {
            
    $this->auth=get_defined_vars();
            
    $this->login();
        }
        
        function 
    login ()
        {
            
    $fp fsockopen($this->auth['host'], 80$errno$errstr30);
            
    fputs($fp"{$this->auth['loginMethod']} {$this->auth['loginPath']} HTTP/1.0\r\n");
            
    fputs($fp"Host: {$this->auth['host']}\r\n");
            
    fputs($fp"Referer: {$this->auth['loginReferer']}\r\n");
            if(
    $this->auth['loginData']!='')
            {
              
    fputs($fp"Content-type: {$this->auth['loginContentType']}\r\n");
              
    fputs($fp"Content-length: "strlen($this->auth['loginData']) ."\r\n");
            }
            
    fputs($fp"Connection: close\r\n\r\n");
            
    fputs($fp$this->auth['loginData']);
            
            
    $res='';
            
            while(!
    feof($fp))
            {
              
    $line=fgets($fp1024);
              
    $res.=$line;
              
              if(
    strpos($res"\r\n\r\n")!==false)
              {
                
    fclose($fp);
                return 
    false;
              }
              if(
    preg_match('@Set-Cookie: '.$this->auth['sessionName'].'=([\da-f]{32})@',$line,$sid))
              {
                
    $this->sessionID=$sid[1];
                
    fclose($fp);
                return 
    true;
              }
              
            }
            
    fclose($fp);
            return 
    false;
        }
        
        function 
    request($path,
                         
    $method,
                         
    $referer='',
                         
    $contentType='',
                         
    $data=''
                        
    )
        {
            
    $fp fsockopen($this->auth['host'], 80$errno$errstr30);
            
    fputs($fp"{$method} {$path} HTTP/1.0\r\n");
            
    fputs($fp"Host: {$this->auth['host']}\r\n");
            
    fputs($fp"Referer: {$referer}\r\n");
            if(
    $data!='')
            {
              
    fputs($fp"Content-type: {$contentType}\r\n");
              
    fputs($fp"Content-length: "strlen($data) ."\r\n");
            }
            
            if(!empty(
    $this->sessionID))
            {
              
    fputs($fp"Cookie: {$this->auth['sessionName']}={$this->sessionID};\r\n");
            }
            
            
    fputs($fp"Connection: close\r\n\r\n");
            
            if(
    $data!='')
            {
              
    fputs($fp$data);
            }


            
    $res='';
            
            while (!
    feof($fp)) 
            { 
              if(isset(
    $body))
              {
                
    $body.=fgets($fp1024); 
              }
              else
              {
                
    $res.= fgets($fp1024); 
                if(
    strpos($res"\r\n\r\n")!==false)
                {
                  unset(
    $res);
                  
    $body='';
                }
              }
            }
            
    fclose($fp);
            return 
    $body;
        }
     }
     
     
     
    $_bot=new bot('doktormolle.de'
                  
    '/temp/355213/login.php',
                  
    'POST',
                  
    'loginName=Hans&pass=Wurst',
                  
    '',
                  
    'application/x-www-form-urlencoded',
                  
    'PHPSESSID'
                  
    );

    if(
    $_bot->login())
    {
      echo 
    'Session-Id geholt:'.$_bot->sessionID.'<hr/>';
      
      
    $news=$_bot->request(
                            
    '/temp/355213/news.php',
                            
    'GET'
                          
    );
      
      echo 
    $news;
    }


    ?>
    Ich hab dafür 2 Dateien online gestellt, zuerst http://doktormolle.de/temp/355213/login.php zum Login:
    Code :
    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
    
    <?php
     
    ini_set('session.use_cookies',1);
    ini_set('session.use_trans_sid',1);
     
    session_start();
     
    if(
        empty($_SESSION['loggedIn'])
          &&
        isset($_POST['loginName']) 
          &&
        $_POST['loginName']=='Hans'
          &&
        isset($_POST['pass']) 
          &&
        $_POST['pass']=='Wurst'
      )
    {
      $_SESSION['loggedIn']=true;
    }
     
    if(!empty($_SESSION['loggedIn']))
    {
      die('Eingelocht');
    }
     
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; 
                                    charset=ISO-8859-1"   />
    <meta name="author"             content="doktormolle" />
    <meta name="date"               content="2010-02-19" />
    <title>Login</title>
    </head>
    <body>
      <form method="post">
        loginName<br/>
        <input name="loginName"/><br/>
        pass<br/>
        <input name="pass"/><br/>
        <input type="submit">
      </form>
    </body>
    </html>
    ...da wird beim Login einfach ne Session-Variable gesetzt.

    und http://doktormolle.de/temp/355213/news.php
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    <?php
    session_start();
     
    if(empty($_SESSION['loggedIn']))
    {
      echo 'Du bist nicht eingeloggt, keine News';
    }
    else
    {
      echo 'Du bist eingeloggt, hier sind die News';
    }
    ?>

    ...das Ergebnis siehst du ja beim Testen.

    Passe mal die Daten an mit deinen und probiere, ob es hinhaut.
    Wenn nicht, müsstest du eventuell die Adressen verraten, die du da abfragst, damit man nachschauen kann, was da vor sich geht.
    KGD92 bedankt sich. 

  10. #10
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Jop, Danke, ich schau mal was sich machen lässt
     

  11. #11
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Also ich kommen meinem Ziel näher Ich benutze zur Zeit folgende Funktion zum auslesen der Webseite

    PHP-Code:
    function PostToHost($host$path$referer$data_to_send) {
      
    $res "";
      
    $fp fsockopen($host80);
      
    printf("Open!\n");
      
    fputs($fp"GET $path HTTP/1.1\r\n");
      
    fputs($fp"Host: $host\r\n");
      
    //fputs($fp, "Referer: $referer\r\n");
      
    fputs($fp"Cookie: PHPSESSID={$this->session}&ServerID={$this->serverid}\r\n");
      
    fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
      
    fputs($fp"Content-length: "strlen($data_to_send) ."\r\n");  
      
    fputs($fp"Connection: close\r\n\r\n");
      
    fputs($fp$data_to_send);
      
    printf("Sent!\n");
     
      while(!
    feof($fp)) {
          
    $res .= fgets($fp);
      }
      
    printf("Done!\n");
      
    fclose($fp);
      print(
    "<br>".$res); 
    So, ich bekomme auch eine Ausgabe allerdings enthält diese nur den Header

    Code :
    1
    
    HTTP/1.0 302 Found Date: Sat, 20 Feb 2010 17:50:23 GMT Server: Apache P3P: CP="CAO OUR" Set-Cookie: PHPSESSID=51a3af58b34fafc27f3317b70e05fa17; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Location: / Content-Length: 0 Connection: close Content-Type: text/html

    Also so langsam geht mir mein Latein langsam aus !?

    Danke schonmal
     

  12. #12
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Die Header sagen da eigentlich alles aus.

    Der Inhalt ist lt. Server temporär unter anderer Adresse verfügbar(HTTP-Status 302), und zwar unter / (siehe Location-Header)
    KGD92 bedankt sich. 

  13. #13
    KGD92 KGD92 ist offline Mitglied Silber
    Registriert seit
    Dec 2009
    Beiträge
    64
    Okay, danke
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 16.09.05, 10:52
  2. Externes Programm in eigenem Fenster ausführen
    Von jokey2 im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 18.05.05, 10:06
  3. Externes Programm ausführen
    Von rettich im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 3
    Letzter Beitrag: 27.04.05, 15:54
  4. Antworten: 12
    Letzter Beitrag: 12.09.04, 12:30
  5. externes bild holen und speichern
    Von ultrakollega im Forum PHP
    Antworten: 4
    Letzter Beitrag: 26.03.03, 14:15