Externes Formular ausführen und cookie speichern

KGD92

Mitglied
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:
<?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($host, 80);
		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($fp, 128);
		}
		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 ()
	{
	
	}
 }

?>
 
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:
        $fp = fsockopen($host, 80);
        fputs($fp, "GET /loginerforderndeNews.php HTTP/1.1\r\n");
        fputs($fp, "Host: $host\r\n");
        fputs($fp, "Connection: close\r\n");
        fputs($fp, "Cookie: namesDesCookies=wertDesCookies\r\n\r\n");
 
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 :D

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
 

Anhänge

  • cookie.png
    cookie.png
    51 KB · Aufrufe: 83
So zum Beispiel:
Code:
	function login_use ()
	{
		$data = "loginName=*****&pass=******";
 
		printf("Go!\n");
		$x = $this->login(
              "**************",
              "/index.php",
              "******************",
              $data);
             preg_match('@PHPSESSID=([\da-f]{32})@,$x,$sid);
             //in $sid[1] sollte jetzt die Session-ID stehen

		$content = require("*********/index.php");
		printf($content);
	}
 
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:
<?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($host, 80);
		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($fp, 128);
		}
		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 ) ) 
		{ 
			$inhalt= fread($fp, 80); 
		}
		
		echo "<p>".$inhalt."</p>";
	}
 }

?>

Ich bekomme jetzt folgende Ausgabe
Code:
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
 
Okay, danke, dann hab ich die Zahl etwas missinterpretiert :D 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:
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
 
Zuletzt bearbeitet:
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:
<?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, $errstr, 30);
        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($fp, 1024);
          $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, $errstr, 30);
        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($fp, 1024); 
          }
          else
          {
            $res.= fgets($fp, 1024); 
            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:
<?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:
<?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.
 

Neue Beiträge

Zurück