Ist das sicher?

Lektor21

Erfahrenes Mitglied
Guten Abend nochmal!

Ich habe ein Script für PayPal geschrieben, dass PayPal bei erfolgreicher Zahlung aufruft!

Also bevor ich die Kaufabwicklung starte ordne ich dem Benutzer eine 10-stellige transid zu, die in die Datenbank geschrieben wird und per Formular mit an PayPal übergeben wird! Bei erfolgreicher Zahlung wird diese meinem Script am ende übergeben. In diesem schaue ich in der Datenbank wer diese hat und schreibe ihm das Geld gut. Danach lösche ich die transid und gebe ihm bei nächten mal eine neue!

Ist das ganze sicher? Oder kann man das auch auslesen?

Hier noch mein Script:

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);



// assign posted variables to local variables
$payment_status = $_POST['payment_status'];
$item_name = $_POST['item_name'];
$transid = $_POST['invoice'];
$price = $_POST['mc_gross'];


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

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

$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";
$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("$time[0]","$time[1]",0,"$date[1]","$date[0]","$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());

}
?>
 
Hört sich ganz gut an.
Noch besser wäre ein 32-stelliger md5-Key (aber nicht erforderlich).
Eine mögliche Sicherheitslücke ist noch das Protokoll.

Dein User sollte per SSL diesen Key im Formular erhalten.
Damit niemand den Key vorher abfängt und ihn missbraucht.

Wenn Du das Ganze noch mit einem Cookie absicherst (also Cookie ID auch in DB), dann könntest Du noch den Clienten Identifizieren (Ein anderer Rechner könnte den Key nicht "einlösen").

Hoffe ich konnte helfen :)

Gruß tyg3r
 
Vielen Dank schonmal für deine schnelle Antwort! :)

Wie Codiere ich denn die Variable am Anfang mit md5?

SSL habe ich mich leider noch nie beschäftigt! https? Ich glaube dass funktioniert bei meinem Webserver nicht :confused:
 
$_key = md5(time().microtime());
http://www.php.net/manual/de/function.md5.php

Konnte Deinem Code jetzt aber nicht entnehmen, wo der Key zum Einsatz kommen sollte.
Vermute die wird zuvor per POST übergeben:
$transid = $_POST['invoice'];
Dann sollte man die auch schon vorher ändern.
Aber wenn Du das nicht selber hinbekommst, würde ich es weglassen :)

Frage mich sowieso, weshalb du nen Socket zu PayPal eingerichtet hast *kopfkratz*
 
Hmm das wollen die soo...

Die Daten werden nochmal zurück geschickt an PayPal! :)

Hmmm....

PHP:
<?php
$str = 'apple';

if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
    echo "Haetten Sie lieber einen gruenen oder einen roten Apfel?";
    exit;
}
?>

$str ist also ein Globales Wort, mit dem dann das eigentliche Passwort verschlüsselt wird, ja?

Wie wende ich das nun auf die Variable $transid an? :confused:
 
$transid = md5($transid);
Aber kann nicht nachvollziehen, ob die ID zuvor schonmal "original" verwendet wurde und das dein System nun fehlerhaft ist, da die ID nichtmehr übereinstimmen.

Gruß tyg3r
 
Ich kann ja beim anlegen die transid schon in das md5 - umformatieren!

Wie lang ist diese Codierung? Muss ich nicht noch ein Wort definieren, mit dem ich dann die Daten verschlüssele?

Oder reicht einfach nur Variable = md5($blabla); ?

Und wie encodiere ich dann wieder?
 
Zuletzt bearbeitet:
Der md5 Code ist 32 Stellen lang (type string).

$passwort = md5("mein_passwort");

Auf "mein_passwort" wird ein Algorythmus angewendet der einen 32 stelligen Code erzeugt.
Man kann daraus den eingebenen String nicht auslesen.

Wird der Key mitgelesen (fishing), dann bringt der Dir natürlich auch nichts (deshalb SSH!).
Ich hab den nur deshalb vorgeschlagen, da 32 Stellen schwerer zu "erraten" sind als 10 Stellen.

$key = md5(time().microtime());
Erzeugt einen md5 Key der auf der aktuellen Zeit basiert, somit ist er immer unterschiedlich.
Soetwas solltest Du also für deinen Fall verwenden.

Gruß tyg3r
 
Also ich habe bereits nun meine Passwörter in der Datenbank codiert!

Nun weiß ich nicht wie ich das bei login.php einbaue;

PHP:
<?php




if      ($anmelden) { anmelden($fertig, $user, $password1, $password2, $email);}
else if ($abmelden) { abmelden($fertig, $user, $password);}
else if ($forgot)   { forgot($fertig, $email);}
else                { login($fertig, $user, $password);}




?>



<?php
function inhalt($user) 
{
session_start();
session_register("user");
?>


<html>
<head>
<link rel="stylesheet" href="format.css" type="text/css">
<script type="text/javascript">
function frame_href(){
parent.content.location.href='userprofile.php';
}
</script>
<script type="text/javascript">

function exit() {
  document.location.href="logout.php";
}
</script>
</head>
<body bgcolor="#DE001F" onLoad="frame_href()" onUnload="exit()" topmargin="0" leftmargin="0">
<table width="100%" border="0">
<tr>
<td align="center"><b>Eingeloggt als:</b><br><font color="#FFFF00"><b><?php echo("$user"); ?></b></font></td>
</tr>
<tr>
<td align="center"><input type="button" style="width:68px;" class="button" value="Support" onClick="parent.content.location.href='support.php'"><input type="button" class="button" value="Logout" style="width:68px; color:#FF0000;" onClick="window.location.href='logout.php'"><br>
<input type="button" class="button" value="Account" style="width:136px;" onClick="parent.content.location.href='userprofile.php'">
</td>
</tr>
</table>
</body>
</html>

	
<?php


}
?>







<?php
function login($fertig, $user, $password)
{
include("../data/config.php");

if ($fertig) {

$abfrage = mysql_query ("SELECT * FROM user WHERE user = '$user'") OR die(mysql_error());
$reihen = mysql_num_rows($abfrage);
if ($reihen <= 0) {
echo "<head><meta http-equiv='refresh' content='3;URL=login.php'></head><center><font color='FFFFFF'><b><blink>Unbekannter Benutzername oder falsches Passwort!</blink></b></font></center>";
}
else {
while ($row = mysql_fetch_object ($abfrage)) {



if ($row->password==$password) {
inhalt($user);
}
else {
echo "<head><meta http-equiv='refresh' content='3;URL=login.php'></head><center><font color='FFFFFF'><b><blink>Unbekannter Benutzername oder falsches Passwort!</blink></b></font></center>";
}
}
}

}

else {

	echo "<form method=\"POST\" action=\"$PHP_SELF?fertig=yes\">";
	?>
        <HEAD>
           <link rel="stylesheet" href="format.css" type="text/css">
        </HEAD>
	<BODY bgcolor="#DE001F" topmargin="0" leftmargin="0">
      <table border="0">
         <tr>
            <td><font color="#FFFF00"><b>AutoFeedback-Login</b></font></td>
         </tr>
         <tr>
            <td><input type="text" name="user" class="login" style="width: 144px;"></td>
         </tr>
         <tr>
            <td><input type="password" name="password" class="login" style="width: 144px;"><br><input type="submit" class="button" value="Login">&nbsp;<?php echo("<a href=\"$PHP_SELF?forgot=yes\"><font color='FFFFFF'>Vergessen?</font></a>"); ?></td>
         </tr>
      </table>
</form>
</BODY>
<? 

}

}
?>




<?php
function forgot ($fertig, $email)
{

if ($fertig) {
$abfrage=mysql_query("SELECT * FROM user") OR die(mysql_error());
while ($row = mysql_fetch_object ($abfrage)) {
if ($email==$row->email) { $ismail="true"; } 
}
if ($ismail=="true") {
$password=mysql_query("SELECT * FROM user WHERE email = '$email'") OR die(mysql_error());
while ($row = mysql_fetch_object ($password)) {
$nachricht="Ihre angeforderten Zugangsdaten für AutoFeedback.de lauten:\n\nBenutzername: $row->user\nPasswort: $row->password\n\n\n\nDiese Nachricht wurde automatisch auf Anweisung von $row->user vom System erstellt.\nBitte antworten Sie nicht auf diese Nachricht! Vielen Dank!";
}
mail($email, "Vergessene Benutzerdaten", $nachricht, "From: System@AutoFeedback.de");
?>
<head><meta http-equiv="refresh" content="3;URL=login.php"></head>
<p><center><font color="#008000"><b><blink>Ihre Daten wurden erfolgreich versendet!</blink></b></font></center></p>

<?php

}
else { echo "<head><meta http-equiv='refresh' content='3;URL=login.php'></head><center><font color='FFFFFF'><b><blink>Die angegebene Emailadresse konnte nicht zugeordnet werden!</blink></b></font></center>";}
}
else {


echo "<p><form method=post action=\"$PHP_SELF?forgot=yes&fertig=yes\">";
?>

<HEAD>
<link rel="stylesheet" href="format.css" type="text/css">
</HEAD>
<BODY bgcolor="#DE001F" topmargin="0" leftmargin="0">
      <table border="0">
         <tr>
            <td>
               <table border="0">
                  <tr>
                     <td valign="middle"><font size="+0"><b>Vergessene Daten</b></font></td>
                  </tr>
               </table>
            </td>
         </tr>
         <tr>
            <td><input type="text" name="email" class="login" style="width: 144px;"><br><input type="submit" style="width: 144px;" class="button" value="Passwort zusenden"></td>
      </table>
</form>
</BODY>

<?php
}
}
?>


Wie kann ich dieses verschlüsselte Passwort eigentlich wieder sichtbar machen?

PS: Auf meinen transid werde ich das nicht anwenden! Ich werde einfach einen längeren Code generieren lassen!
 
Zuletzt bearbeitet:
Irgendwo definierst Du ja deine ganzen Passwort Variablen etwa mit:
$password = (isset($_POST['password'])) ? $_POST['password'] : null;

daraus einfach:
$password = (isset($_POST['password'])) ? md5($_POST['password']) : null;
 
Zurück