Sicherheitsfrage aus Zufallszahlen

Hallo zusammen.

Vorab:
Ich habe 2 php-Dateien.
site.php: Dieses test.php

<?php session_start(); ?>

test.php: Dieses Script erzeugt die Bilddatei

<?php <?php<br />session\_start();
header("Content-type: image/png");

$img = imagecreatefrompng("button1.png");

for ($a = 0; $a \< 5; $a++) {
 $randomNumber = mt\_rand(1,9);
 $tmpString .= createString($randomNumber);
}

$white = imagecolorallocate($img, 255, 255, 255);
$pos = (imagesx($img) \* strlen($string))+4;
imagestring($img, 4, $pos, 4, $tmpString, $white);

imagepng($img);
imagedestroy($img);
$\_SESSION["checkValue"] = $tmpString;

function createString($x) {
 return($x);
}
?\>

Anhand dieser 2 Dateien, erzeuge ich eine Zufallszahl in einem Bild. Klappt wunderbar.
Jedoch, wenn ich im Script site.php die Session[„checkValue“] abfrage, bekomme ich immer den Wert der Zufallszahlen, des letzten Durchlaufs, warum??

Was habe ich übersehen?

Wie gesagt, das Bild wird geladen, die Zufallszahlen werden berechnet, nur die Session hat immer einen Wert vor dem aktuellen Wert drinnen… :frowning:

Bitte um Hilfe.

Besten dank,
Sebastian

Hallo,

so wie du die zufallszahl speicherst macht das keinen sinn.
ich nehm einfach mal an das du mit diesem Captcha bots ausschließen willst.

da die Bots aber zugriff auf den Quelltext hätten würde die Zahl dort in Klarschrift stehen so das diese ohne aufwand ausgelesen und angegeben werden könnte.

wenn du den Captcha sicher speichern willst musst du ihn rein Serverseitig abspeicher. Z.Bsp. als textfile oder in einer Datenbank.

zu der Session nehme ich jetzt einfach mal an das das script site.php vor dem script test.php zuende ist da dieses script als eigene anfrage ausgeführt wird und die site.php nicht wartet bis in das script test.php zuende ist.

Gruß

Hi.

so wie du die zufallszahl speicherst macht das keinen sinn.
ich nehm einfach mal an das du mit diesem Captcha bots
ausschließen willst.

da die Bots aber zugriff auf den Quelltext hätten würde die
Zahl dort in Klarschrift stehen so das diese ohne aufwand
ausgelesen und angegeben werden könnte.

Genau, das will ich verhindern, jedoch, werde ich das input=„text“ in input=„hidden“ ändern, dann dürfte es kein Problem sein, oder etwa doch??

wenn du den Captcha sicher speichern willst musst du ihn rein
Serverseitig abspeicher. Z.Bsp. als textfile oder in einer
Datenbank.

habe ich mir auch schon überlegt, würdest du dann die ip, die zufallszahl und den timestamp in die datenbank eintragen, und dann überprüfen??

zu der Session nehme ich jetzt einfach mal an das das script
site.php vor dem script test.php zuende ist da dieses script
als eigene anfrage ausgeführt wird und die site.php nicht
wartet bis in das script test.php zuende ist.

Ja also das site.php wird aufgerufen, im img src=„test.php“ und dann wieder zurück nach site.php.

die session wird in test.php gesetzt…

Wie würde man denn das sonst noch machen??

Grüsse,
Sebastian

in der site.php würde ich eine eindeutige id generieren

site.php:

<?PHP $id = uniqid();<br />?\>
...

...

in der test.php speicherst du dann die id + den dazugehörigen captcha in einer tabelle.

nach dem abschicken prüfst du dann ab ob die id den richtigen captcha eingabe hat.

in der tabelle sollte dann auch ein timestamp stehen und nach einer bestimmten zeit / nach aufruf sollte der eintrag aus der tabelle gelöscht werden.

Gruß

Hallo Sebastian,

der Browser muss nunmal erst die PHP Datei laden, um zu wissen, welche Bilder eingebunden werden sollen, dann die Bilder. Wenn du dann aber eine neue Zufallszahl erzeugst, steht die falsche im Formular (wo sie nicht hin gehört, weil man sich das sonst schenken kann… die kann ein Bot dann nämlich auslesen), da das Bild danach geladen wurde und eine neue Zahl erzeugt hat.

Also

  • Zufallszahl im site.php erzeugen und in der Session speichern,
    nicht ins Formular eintragen, auch nicht als hidden
  • in test.php diese verwenden, um die Grafik zu erzeugen
  • Nach Absenden des Formulars die Zahl aus der Session mit der im
    Formular eingegebenen Zahl vergleichen

Alex

Morgen Phillip!!

<?PHP :blush:id = uniqid();
?\> ... ... in der test.php speicherst du dann die id + den dazugehörigen captcha in einer tabelle. nach dem abschicken prüfst du dann ab ob die id den richtigen captcha eingabe hat. in der tabelle sollte dann auch ein timestamp stehen und nach einer bestimmten zeit / nach aufruf sollte der eintrag aus der tabelle gelöscht werden.

ich habs jetzt genau so gemacht, wie du gesagt hast, ich generiere eine ID, diese ID übergeb ich dem anderen (test.php) PHP-Script, frage dann ab ob die ID und der Wert von input type=„text“ mit den Werte in SQL übereinstimmt, wenn ja > Eintrag hinzufügen, wenn nein > Eintag nicht hinzufügen.

Hat alles einwandfrei geklappt…

Grüsse,
Sebastian