Frage zu Socket

Lektor21

Erfahrenes Mitglied
Hallo!

Ich habe ein Script, dass von PayPal nach erfolgreicher Zahlung ausgeführt wird! Nur möchte ich mal gern wissen was hier gemacht wird;

PHP:
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

und hier:

PHP:
if (!$fp)
{
// HTTP ERROR
echo "fehler";
}
else
{
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{


SCRIPT


}

Wenn ich das untere einbaue gehts nicht mehr
 
Hi,

was bedeutet "geht nichts mehr" ?
Wird ein bestimmter IF-Therm ausgelöst?

Das Script baut eine verbindung zum PayPal server auf, setzt einen Requeststring ($req GET) zusammen und liest Dir die Antwort in die Variable $res ein.

Man könnte sagen das Script simuliert eine Browseranfrage, nur dass das Response nicht auf den Bildschirm sondern in die Variable $res geschrieben wird.

Gruß tyg3r
 
Also das obere funktioniert, wenn es eingebaut ist!

Wenn ich aber das untere einbaue und darin mein Script platziere gehts nicht!

Was Fragt der hier ab

PHP:
if (!$fp)
{
// HTTP ERROR
echo "fehler";
}
else
{
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{


SCRIPT


}
 
Hi

er prüft ob ein Objekt auf $fp erzeugt werden konnte (also ob der Socket erstellt werden konnte).
Anschließend werden mit fputs die Daten an den Server geschickt.
In der while-Schleife werden die Informationen (die Antwort) des Servers gelesen.

Mich wundert, warum dein Script innerhalb dieser Schleife liegt. Sollte erst anschließend stehen.

mach nach der Schleife einfach ein print_r($res); exit; und schaue ob ein Response des Servers angekommen ist.

Gruß tyg3r
 
Na ich weiß nicht!?

Wie würdest du das anordnen? Weil ich habe ein kleines Script gefunden und dies ziemlich erweitert!

PHP:
<?php

$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);


$transid = $_POST['custom'];
$price = $_POST['mc_gross'];


if (!$fp)
{
// HTTP ERROR
echo "fehler";
}
else
{
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{


if (($transid != "") && ($price != ""))
{

include('../data/config.php');

$info=mysql_query("SELECT * FROM user WHERE transid = '$transid'") OR die(mysql_error());
while ($row = mysql_fetch_object ($info)) {
$premiumuser_to_date="$row->premiumuser_to_date";
$premiumuser_to_time="$row->premiumuser_to_time";
$email="$row->email";
$payed="$row->payed";
}

$result=mysql_query ("SELECT pricepermonth FROM data") OR die(mysql_error());
while ($row=mysql_fetch_array($result)) {
$pricepermonth=$row["pricepermonth"];
}

$time_current = time();
$date_current = date("d.m.Y");

$date = explode(".","$premiumuser_to_date");
$time = explode(":","$premiumuser_to_time");

$premiumuser_to = mktime((int)$time[0], (int)$time[1], 0, (int)$date[1], (int)$date[0], (int)$date[2]);

$payed_new = ($payed + $price);

$premium_months = ($price / $pricepermonth);


if ($time_current > $premiumuser_to)

{
           $date = explode(".",$date_current);

           $premiumuser_to_date_new = date("d.m.Y",mktime(0,0,0,$date[1]+$premium_months,$date[0],$date[2]));
           $premiumuser_to_time_new = date("H:i");

}

elseif ($time_current < $premiumuser_to)

{

           $date = explode(".",$premiumuser_to_date);  

           $premiumuser_to_date_new = date("d.m.Y",mktime(0,0,0,$date[1]+$premium_months,$date[0],$date[2]));
           $premiumuser_to_time_new = $premiumuser_to_time;

}


mysql_query("UPDATE user SET premiumuser_to_date = '$premiumuser_to_date_new', premiumuser_to_time = '$premiumuser_to_time_new', payed = '$payed_new', transid = NULL WHERE transid = '$transid'") OR die(mysql_error());


$to  = "$email";
$titel = "Zahlung erfolgreich abgeschlossen";
$content = "
<html>
<head>
</head>
<body>
<font color='#008000'><b>Ihre Zahlung war erfolgreich!</font>
<br>
<br>
Ihre Zahlung wird erst sichtbar, wenn Sie Ihr Mitgliedskonto aktualisieren, bzw. wenn Sie sich neu einloggen!
<br>
Aktiviert ist Ihr Premium bereits jetzt!</b>
<br>
<br>
<br>
<table border='0'>
<tr>
<td><font color='#0000FF'><b>Laufzeit:</b></font></td><td><font color='#0000FF'><b>$premium_months Monat(e)</b></font></td>
</tr>
<tr>
<td><font color='#0000FF'><b>Betrag:</b></font></td><td><font color='#0000FF'><b>$price EUR</b></font></td>
</tr>
<tr>
<td><font color='#0000FF'><b>Premium bis:</b></font></td><td><font color='#0000FF'><b>$premiumuser_to_date_new</b></font></td>
</tr>
</table>
<br>
<br>
<br>
<table width='100%' border='0'>
<tr>
<td bgcolor='#C0C0C0'><b><font color='#FFFFFF'>
Bitte beachten Sie, dass diese E-Mail vom System erstellt wurde und daher die Antwortfunktion nicht genutzt werden kann!
Bei Fragen, Problemen oder Anregungen nutzen Sie bitte das Supportformular in Ihrem Account!
</b></font>
</td>
</tr>
</table>
<br>
<br>
<br>
Wir bedanken uns f&uuml;r Ihr Vertrauen in unseren Service und verbleiben mit freundlichen Gr&uuml;&szlig;en!
<br>
<br>
Ihr <a href='http://www.autofeedback.de'>AutoFeedback.de</a> - Team
</b>
</body>
</html>
";

$header  = "MIME-Version: 1.0\r\n";
$header .= "Content-type: text/html; charset=iso-8859-1\r\n";
$header .= "From: AutoFeedback.de <Support@AutoFeedback.de>\r\n";

mail($to, $titel, $content, $header);

}
}
}
}
?>
 
Konnte es leider nicht auf Funktionalität prüfen, würde es aber so anordnen:

PHP:
<?php
// Variablen oben deklarieren/definieren für die Übersicht
$transid = $_POST['custom'];
$price = $_POST['mc_gross'];
$res = null; // Variable für Response
$req = 'cmd=_notify-validate'; // Requeststring
foreach ($_POST as $key => $value) {
	$value = urlencode(stripslashes($value));
	$req .= "&$key=$value";
}

// header für Socket
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

// Socket erstellen
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
if (!$fp){
	die("Konnte Socket nicht erstellen!");
}
else{
	// request
	fputs ($fp, $header . $req);
	// response
	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		if (strcmp ($res, "VERIFIED") == 0){
			break;
		}
	}
	
	// wenn Response vorliegt
	if(!empty($res)){
		if (($transid != "") && ($price != "")){
			include('../data/config.php');
			$info=mysql_query("SELECT * FROM user WHERE transid = '$transid'") OR die(mysql_error());
			while ($row = mysql_fetch_object ($info)) {
				$premiumuser_to_date = stripslashes($row->premiumuser_to_date; // backslashes entfernen
				$premiumuser_to_time = stripslashes($row->premiumuser_to_time;
				$email = stripslashes($row->email);
				$payed = stripslashes($row->payed);
			}

			$result=mysql_query ("SELECT pricepermonth FROM data") OR die(mysql_error());
			while ($row=mysql_fetch_array($result)) {
				$pricepermonth = stripslashes($row["pricepermonth"]);
			}

			$time_current = time();
			$date_current = date("d.m.Y");
			$date = explode(".",$premiumuser_to_date);
			$time = explode(":",$premiumuser_to_time);
			$premiumuser_to = mktime((int)$time[0], (int)$time[1], 0, (int)$date[1], (int)$date[0], (int)$date[2]);
			$payed_new = ($payed + $price);
			$premium_months = ($price / $pricepermonth);

			if ($time_current > $premiumuser_to){
				$date = explode(".",$date_current);
				$premiumuser_to_date_new = date("d.m.Y",mktime(0,0,0,$date[1]+$premium_months,$date[0],$date[2]));
				$premiumuser_to_time_new = date("H:i");
			}
			elseif ($time_current < $premiumuser_to){
				$date = explode(".",$premiumuser_to_date);
				$premiumuser_to_date_new = date("d.m.Y",mktime(0,0,0,$date[1]+$premium_months,$date[0],$date[2]));
				$premiumuser_to_time_new = $premiumuser_to_time;
			}

			mysql_query("UPDATE user SET 
							premiumuser_to_date = '".$premiumuser_to_date_new."',
							premiumuser_to_time = '".$premiumuser_to_time_new."',
							payed = '".$payed_new."', 
							transid = NULL 
						WHERE transid = '".$transid."'
					") OR die(mysql_error());

			$to  = $email;
			$titel = "Zahlung erfolgreich abgeschlossen";
			$content = "<html>
						<head>
							</head>
						<body>
							<font color='#008000'><b>Ihre Zahlung war erfolgreich!</font>
							<br>
							<br>
							Ihre Zahlung wird erst sichtbar, wenn Sie Ihr Mitgliedskonto aktualisieren, bzw. wenn Sie sich neu einloggen!
							<br>
							Aktiviert ist Ihr Premium bereits jetzt!</b>
							<br>
							<br>
							<br>
							<table border='0'>
								<tr>
									<td><font color='#0000FF'><b>Laufzeit:</b></font></td><td><font color='#0000FF'><b>$premium_months Monat(e)</b></font></td>
									</tr>
								<tr>
									<td><font color='#0000FF'><b>Betrag:</b></font></td><td><font color='#0000FF'><b>$price EUR</b></font></td>
									</tr>
								<tr>
									<td><font color='#0000FF'><b>Premium bis:</b></font></td><td><font color='#0000FF'><b>$premiumuser_to_date_new</b></font></td>
									</tr>
								</table>
							<br>
							<br>
							<br>
							<table width='100%' border='0'>
								<tr>
									<td bgcolor='#C0C0C0'><b><font color='#FFFFFF'>
										Bitte beachten Sie, dass diese E-Mail vom System erstellt wurde und daher die Antwortfunktion nicht genutzt werden kann!
										Bei Fragen, Problemen oder Anregungen nutzen Sie bitte das Supportformular in Ihrem Account!
										</b></font>
										</td>
									</tr>
								</table>
							<br>
							<br>
							<br>
							Wir bedanken uns f&uuml;r Ihr Vertrauen in unseren Service und verbleiben mit freundlichen Gr&uuml;&szlig;en!
							<br>
							<br>
							Ihr <a href='http://www.autofeedback.de'>AutoFeedback.de</a> - Team
							</b>
							</body>
						</html>";
						
			$header  = "MIME-Version: 1.0\r\n";
			$header .= "Content-type: text/html; charset=iso-8859-1\r\n";
			$header .= "From: AutoFeedback.de <Support@AutoFeedback.de>\r\n";
			mail($to, $titel, $content, $header);
		}
	}
        else{
                die("Fehler, keine Daten erhalten!");
        }
}
?>
 
Zuletzt bearbeitet:
Danke das geht! :)

Aber in Line 39 und 40 hat noch ne Klammer zu vorm Semikolon gefehlt ;)

Ist das nun eigentich ein wenig sicher? Also das es nicht so einfach manipuliert werden kann!!
 
Na wunderbar :)

Wie "sicher" das ganze ist, kann man pauschal nicht beantworten.
Sicherheitslücken könnten ja auch schon vorher in deiner Anwendung sein.

Da müßte ich mich jetzt sehr intensiv mit beschäftigen.
Sobald der Key irgendwo übertragen/sichtbar wird, sollte man mit einem SSL Protokoll arbeiten. Aber auch wenn der Key "gefished" werden sollte, ist es nicht allzu leicht, diesen zu mißbrauchen. Er wird ja immer nur per POST und nicht per GET übertragen.

Ein "Sicherheitsupgrade" wäre noch, die komplette Sitzung mit einem Cookie zu begleiten und den Key nur diese Sitzung verwenden zu lassen.

Gruß und gn8
tyg3r
 
Also wie gesagt, ich übergebe PayPal diesen Key per SSL (Adresse fängt mit https an! Den Key erstelle ich, wenn der User kauft. Dieser ist 32 Stellen lang!

Und wie gesagt, nur das Script am Ende weiß dann, wer den Key gerade hat! Nach der Transaktion wird der Key wieder gelöscht und beim nächten Mal wieder einer per Zufall erstellt!
 
Joa, so vom groben Ablauf hört sich das doch gut an.
Aber es wäre gewagt da eine konkrete Antwort auf Sicherheitsfragen zu geben.

Selbst PayPal wurde vor kurzem erst gehackt ...

Man sollte sich eher fragen, welchen Nutzen ein Hacker davon hätte einen solchen Key zu mißbrauchen, im Vergleich zwischen "Gewinn" und Risiko eine solchen Straftat überlegt sich das jeder 2 mal :)
 
Zurück