POST per Header senden

Parantatatam

mag Cookies & Kekse
Hallo,

ich habe mich gerade mal mit dem Thema POST per Header senden beschäftigt und habe ein kleines Programm geschrieben:
post_by_headers.php
PHP:
<?php
session_start();

function PostToHost($rawurl, $data)
{
	foreach($data as $key => $value)
	{
		if(trim($key) != '' && trim($value) != '')
		{
			$data_to_send .= '&'.$key.'='.$value;
		}
	
		if(substr($data_to_send, 0, 1) == '&')
		{
			$data_to_send = substr($data_to_send, 1);
		}
	}
	
	$url  = explode('//', $rawurl, 2);
	$url  = $url[1];
	$host = explode('/', $url, 2);
	$path = '/'.$host[1];
	$host = $host[0];
	
	if(!$fp = @fsockopen($host, 80))
	{
		echo 'Verbindungsaufbau fehlgeschlagen!';
		return FALSE;
	}
	
	fputs($fp, 'POST '.$path.' HTTP/1.1'."\r\n");
	fputs($fp, 'Host: '.$host."\r\n");
	fputs($fp, 'Referer: '.$rawurl."\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);
	
	while(!feof($fp))
	{
		$res .= fgets($fp, 128);
		#break;
	}
	
	fclose($fp);
	
	return array('referer' => $rawurl, 'host' => $host, 'path' => $path, 'data' => $data_to_send, 'resource' => explode("\n", $res));
}

$data = array('username' => 'admin', 'password' => 'test');

print_r(PostToHost("http://localhost/iFramework/get_headers.php", $data));
print_r($_SESSION);
?>
get_headers.php
PHP:
<?php
session_start();
if(!empty($_POST))
{
	$_SESSION['username'] = $_POST['username'];
	$_SESSION['password'] = $_POST['password'];
}
print_r($_SESSION);
?>
Das erzeugt folgende Ausgabe (post_by_headers.php):
Code:
Array
(
    [referer] => http://localhost/iFramework/get_headers.php
    [host] => localhost
    [path] => /iFramework/get_headers.php
    [data] => username=admin&password=test
    [resource] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Date: Tue, 26 May 2009 12:12:02 GMT
            [2] => Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8e DAV/2 PHP/5.2.5
            [3] => X-Powered-By: PHP/5.2.5
            [4] => Set-Cookie: PHPSESSID=35384f9fdf82c718634b91a629cdd597; path=/
            [5] => Expires: Thu, 19 Nov 1981 08:52:00 GMT
            [6] => Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
            [7] => Pragma: no-cache
            [8] => Content-Length: 57
            [9] => Connection: close
            [10] => Content-Type: text/html
            [11] => 
            [12] => Array
            [13] => (
            [14] =>     [username] => admin
            [15] =>     [password] => test
            [16] => )
            [17] => 
        )

)

Array
(
    [username] =>
    [password] =>
)

Wie man schön sehen kann sind die Werte des letzten Arrays leer. In diesen sollten aber die Werte aus $_SESSION stecken. Kurze Frage: wo liegt mein Fehler? Es müsste doch eigentlich gehen? Die per POST gesendeten Daten kommen ja bei get_headers.php an und werden dort in die Session geladen, aber wenn ich sie dann aufrufe existieren sie auf einmal nicht mehr.
 
Zuletzt bearbeitet:
Ich versteh nich so ganz wo dein Problem liegt. Hier sind doch deine Daten:

PHP:
            [10] => Content-Type: text/html
            [11] => 
            [12] => Array
            [13] => (
            [14] =>     [username] => admin
            [15] =>     [password] => test
            [16] => )
            [17] =>

Oder hab ich was falsch verstanden? Du wolltest doch username und password da übergeben in das POST?
 
Hi,

die Ausgabe des leeren Arrays kommt ja auch aus der Script-Instanz, die durch Aufrufen der Seite im Browser erzeugt wird. Da gibt's noch keine POST-Daten. Das Script einen POST-Request auf sich selbst machen zu lassen, ohne Abfrage, ob es schon durch diesen POST-Request aufgerufen wurde, ist irgendwie auch etwas sinnbefreit. Das war im Original-Beispiel auch nicht so gedacht.

LG
 
Ja, das hast du richtig gesehen: dort sind die Daten aus der Session, aber wenn ich sie später aufrufe existieren die Daten aus der Session nicht mehr und ich weiß nicht warum.

EDIT: Hm, aber wenn ich danach die get_headers.php aufrufe werden mir trotzdem keine Werte mehr angezeigt.
 
Zuletzt bearbeitet:
Wenn ich das richtig sehe gibt dir die get_headers.php doch dass aus was du haben willst, nur ist es sinnfrei in deiner post_by_header.php auch ein print_r($_SESSION) zu schreiben. Dort ist die Session ja leer und bleibt auch leer weil deine get_headers.php nur die Rückgabe an also dass was aus dem print_r in der Datei zurück kommt dir anzeigt.
 
Lassen wir mal das print_r($_SESSION) in der post_by_headers.php und betrachten nur die Ausgabe von get_headers.php: Wenn ich in dieser die Session-Variablen username und password gesetzt habe, so müssten die ja weiterhin befühlt sein, wenn ich die get_headers.php später direkt aufrufe. Da gibt es ja keine Daten von POST und somit dürften die Variablen der Session auch nicht überschrieben werden oder irre ich mich?
 
Hi,

was erwartest Du? In get_headers.php wird ja auch immer eine neue Session gestartet, da kein Session-Cookie übergeben wird. Benutze mal LiveHTTPHeaders und vergleiche die Session-ID mit der aus dem Reponse.

Und bitte poste Code-Änderungen in einem neuen Beitrag, statt den Ausgangspost zu editieren. Das kann doch jemand, der das irgendwann mal liest, gar nicht mehr nachvollziehen. Ursprünglich war das nur ein Script, dass einen Request auf sich selbst abgesetzt hat und von Sessions war auch nicht die Rede. :mad:

LG
 
an kuddeldaddeldu: Die Skript-Änderungen sind berechtigt. Blöderweise habe ich zu früh auf "Thema erstellen" geklickt und somit wurde mein falsches Skript gespeichert. Es geht wirklich direkt um das dort oben stehende Skript.
 
Naja trotzdem musst du dem ganzen noch die SessionId mitteilen. z.B. indem du einen Cookie setzt
PHP:
setcookie('PHPSESSID', session_id() );

und dort wo du die Session fortsetzten willst musst du das ganze dann mit dem nachfolgenden Codebeispiel wieder fortsetzten.
PHP:
$sid = $_COOKIE['PHPSESSID'];
session_id($sid);

Dann sollte zumindest die Session erhalten bleiben genau wie deren Inhalt.
 
an kuddeldaddeldu: Die Skript-Änderungen sind berechtigt. Blöderweise habe ich zu früh auf "Thema erstellen" geklickt und somit wurde mein falsches Skript gespeichert. Es geht wirklich direkt um das dort oben stehende Skript.

Darum geht es überhaupt nicht. Wenn Dir eine knappe halbe Stunde nach Erstellen des Themas einfällt, dass Du Dich über einen anderen Code unterhalten möchtest, dann erkläre das doch in einer Antwort und setze den neuen Code da rein. Wer hat schon Lust, nach dem Schreiben einer Antwort erstmal nachzuschauen, ob der Ausgangspost nicht völlig verändert wurde und die Antwort damit gar keinen Sinn mehr ergibt? Das ist einfach nicht die feine Art. Ich persönlich gucke mal gerade in der Vorschau, ob in der Zwischenzeit schon weitere Antworten eingetrudelt sind, lese aber bestimmt nicht den ganzen Thread nochmal.

LG
 
Zurück