Raik: es gibt da eine Möglichkeit

Beitrag lesen

Hallo Ulf,

ich glaube du meinst ich sollte um mich abzusichern die $PHPSESSID mit übergeben um sicherzustellen das kein Script action.php so einfach überlisten kann, so als zweite absicherung!?

nein, nicht als zweite absicherung.

(wie gesagt, ich weis nicht genau, wie sessions funktionieren, weil ich damit noch nicht gearbeitet habe.
wird die session-id beim aufruf eines php-scriptes mit an den browser und von diesem nach ausfüllen des formulars wieder mit zurück an den server gegeben, auch wenn diese nicht im formular vorhanden ist?)

in deinem vorherigen beispiel wurde index.html als erstes geladen.
in der index.html wird bild.php aufgerufen.
diese soll eigendlich beim aufruf ihre komination in einer gültigen session speichern.
die ist aber zu diesem zeitpunkt noch garnicht angelegt.

ich würde das ja so machen (weis allerdings nicht, ob das notwendig ist):

index.php:
<?php
SESSION_START();
?>
<FORM METHOD="POST" ACTION="action.php">
<INPUT TYPE="hidden" NAME="sid" VALUE="<?php echo $PHPSESSID; ?>">
<TABLE>
<TR>
<TD>Username</TD>
<TD><INPUT TYPE="text" NAME="usr"></TD>
</TR>
<TR>
<TD>Ect</TD>
<TD><INPUT TYPE="text" NAME="ect"></TD>
</TR>
<TR>
<TD>Sicherheits-Code</TD>
<TD><INPUT TYPE="text" NAME="sc"></TD>
</TR>
<TR>
<TD></TD>
<TD><INPUT TYPE="submit"></TD>
</TR>
</TABLE>
</FORM>
IMG SRC="bild.php?sid="<?php echo $PHPSESSID; ?>" BORDER="0" ALT="Sicherheits-Code">

^^^^^^^^^^^^^^^^^^^^^^^^^
muss das sein, oder "erfährt" bild.php auch so von der session-id, die es benutzen soll?

--

bild.php:
<?
SESSION_START();

wenn die aktuelle session nicht automatisch mit übergeben wird, müsste hier erst mal abgefragt werden, ob eine session-id ("$sid") übergeben wurde und ob sie gültig ist. ohne session-id script einfach beenden (" ... or die();").

Textposition

$tx     = 9;
$ty     = 7;

Dimension

$MaxX   = 70;
$MaxY   = 30;

Bild erstellen

header("Content-type: image/png");
$im = @imagecreate($MaxX,$MaxY);

Farben definieren

$white = @ImageColorAllocate($im, 255,255,255);
$red = @ImageColorAllocate($im, 255,0,0);
$green = @ImageColorAllocate($im, 0,255,0);
$gray = @ImageColorAllocate($im, 128,128,128);
$lightgray = @ImageColorAllocate($im, 224,224,224);
$lightblue = @ImageColorAllocate($im, 128,128,255);

@ImageColorTransparent($im, $white); # weiß = transparent

$tcol = explode(",",$tcolor);
$text_color = @ImageColorAllocate($im, $tcol[0], $tcol[1], $tcol[2]);
$bcol = explode(",",$bcolor);
$border_color = @ImageColorAllocate($im, $bcol[0], $bcol[1], $bcol[2]);

$strng='';
for ($i=1; $i<=6;) # Anzahl der Zeichen
{
mt_srand((double)microtime()*1000000);
$char = mt_rand(48,122);

if($char>47 && $char<58 || $char>64 && $char<91 || $char>96 && $char<123)
{
$strng.=chr($char);
$i++;
}
}

$_SESSION['bildsid']=$PHPSESSID;
$_SESSION['secure']=$strng;

@imagefill($im, 0, 0, $lightgray);

Rahmen und Logo setzen

@imagerectangle($im, 0, 0, $MaxX-1, $MaxY-1, $border_color);
@imagestring($im, 5, $tx, $ty, $strng, $text_color);
@imagepng($im);
?>

action.php:
<?php
SESSION_START();

hier muss bei fehlender oder gültiger session-id ein header-redirekt zur index.php rein.
deshalb würde ich den inhalt der action.php auch mit in die index.php packen, weil dann statt eines requests an den browser einfach nur ein sprung an eine andere stelle des scriptes nötig wäre.

$secure=$_SESSION['secure'];
$bildsid=$_SESSION['bildsid'];

if($usr=='')$stop=true;
if($ect=='')$stop=true;
if($sid!=$bildsid)$stop=true;
if($sc!=$secure)$stop=true;

if($stop!=true)
{
$qry = "INSERT INTO usrtbl (usr, ect) VALUES('$usr', '$ect')";
print $qry; // :-)
}
else print "na stimmt was nicht :-o<br>";
?>

der ablauf wäre also:
1. prüfen auf _gültige_ session-id
wenn nein, wieder anzeige des formulars (neue session wird gestartet), sonst weiter
2. prüfen der vom formular übergebenen variablen
wenn nicht i.o., formular mit den werten nochmal anzeigen mit korrektur-aufforderung
(dabei automatisch neue kombination von bild.php in session gespeichert), sonst weiter
3. alles ok, dann eintrag in datenbank und anzeige der erfolgsmeldung (hier wird kombination von bild.php aus der session gelöscht).

jetzt kannst du mir ja was über sessions beibringen. ;-)

freundl. Grüße aus Berlin, Raik