ERLEDIGT
JA
JA
ANTWORTEN
21
21
ZUGRIFFE
703
703
EMPFEHLEN
-
10.01.12 15:15 #1
Hi zusammen,
Ich habe ein Problem mit dem generierten Token für ein Formular.
Der Token wird mit dem Formular zusammen in meiner Index.php erzeugt und soll dann aber in einer Includierten Seite überprüft werden.
Problem an der Sache ist das ja wenn ich das Formular per POST übermittle sich der Token in der Session inzwischen ändert und nicht mehr verarbeitet werden kann.
Includierte Seite:PHP-Code:<?php
function generateFormToken($form){
$token = md5(uniqid(microtime(), true));
$_SESSION[$form."_token"] = $token;
return $token;
}
$token = generateFormToken("form1");
$key = md5(rand(0,99999));
?>
<form action="./index.php?page=search" method="post">
<div class="searchbar">
<input type="text" name="search" class="searchfield input" id="searchfield" maxlength="200" alt="Suche... " value="Suche... " onclick="document.getElementById('searchfield').value=''; this.style.color = '#000';" />
<input type="hidden" name="key" value="<?php echo $key; ?>" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" name="submit" class="search-button" value="" />
</div>
</form>
PHP-Code:function verifyFormToken($form) {
if (!isset($_SESSION[$form."_token"])) {
return false;
}
if (!isset($_GET["token"])) {
return false;
}
if ($_SESSION[$form."_token"] !== $_GET["token"]) {
return false;
}
return true;
}
if (verifyFormToken("form1")) {
// -->
-
10.01.12 15:21 #2
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Warum sollte sich die Session-ID plötzlich ändern? Das kann nur passieren, wenn die Session abgelaufen ist. Die Dauer der Session kannst du beeinflussen:
http://www.php.net/manual/de/functio...kie-params.php
http://www.php.net/manual/de/session...ookie-lifetimeGrüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
10.01.12 15:31 #3
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Die Frage ist auch wo "includet" wird bzw. wann die Funktion zum Prüfen aufgerufen wird.
Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
10.01.12 15:32 #4
Nein, irgendwie hab ichs blöd beschrieben

Ich erzeuge ein Session Token auf der Hauptseite für ein Formular, übermittle ich die Seite per POST wird diese ja nochmal neu aufgerufen und damit auch der Code für den Session Token erneut.
Wenn ich den Session Token in einer Includierten Seite erzeuge und in der anderen Includierten Seite verarbeite geht das ganze ja.
Ich brauch aber dieses Formular auf der Hauptseite das ist das Problem.
Index.php
PHP-Code:.
.
.
function generateFormToken($form){
$token = md5(uniqid(microtime(), true));
$_SESSION[$form."_token"] = $token;
return $token;
}
$token = generateFormToken("form1");
$key = md5(rand(0,99999));
?>
<form action="./index.php?page=search" method="post">
<div class="searchbar">
<input type="text" name="search" class="searchfield input" id="searchfield" maxlength="200" alt="Suche... " value="Suche... " onclick="document.getElementById('searchfield').value=''; this.style.color = '#000';" />
<input type="hidden" name="key" value="<?php echo $key; ?>" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" name="submit" class="search-button" value="" />
</div>
</form>
.
.
.
Hier kommt dann erst der Seiteninclude
.
.Geändert von Starfox2007 (10.01.12 um 15:35 Uhr)
-
10.01.12 15:35 #5
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Aber du musst doch nur prüfen ob der Token bereits existiert oder nicht.
Wenn bereits vorhanden und nicht älter als xx Sekunden/Minuten dann ist er noch gültig, andernfalls muss er erst neu erstellt werden.
Aber warum erstellst du ihn auch auf der "Hauptseite". Du weißt doch dann gar nicht ob das Formular überhaupt aufgerufen wird!?Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
10.01.12 15:41 #6
Das Formular ist ein Suchfeld auf der Hauptseite das immer da ist egal welche Seite includiert ist.
Ein Suchfeld wie hier:
http://eu.battle.net/d3/de/Geändert von Starfox2007 (10.01.12 um 15:50 Uhr)
-
10.01.12 15:50 #7
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Ah, verstehe. Dann musst du den include() für die Prüfung auf jeden Fall vor dem Code erledigen, der den Token neu erzeugt.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
10.01.12 15:51 #8
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Ist eh ein bisschen verwirrend.
- Du rufst mit Hilfe der Variablen $token die Funktion auf.
- Dort wird der gleichnamigen Variablen $token dann mit md5 usw. der Wert übergeben.
- Dann wird dieser Wert an eine SESSION-Variable übergeben.
Wenn du jetzt die SESSION-Variable hast, warum arbeitest du dann im Skript mit $token?
Innerhalb der Funktion kannst du doch auch einfach prüfen ob $_POST['submit'] vorhanden ist, also die Seite durc h anklicken des Buttons aufgerufen wurde. In diesem Fall darf der Wert nicht neu erstellt werden.Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
10.01.12 15:53 #9
Ich hab jetzt den Code ganz unten in die Index Seite gestopft und werde das Suchfeld mittels CSS nach oben verfrachten.
Scheint wohl dann zu funktionieren
Vielen Dank euch beiden
-
11.01.12 12:33 #10
Leider bin ich immer noch nicht weiter,
wenn ich den Code auf der Index.php unter den Include setze bekomme ich das mit CSS nichtmehr richtig angeordnet, weil auch der Div unter dem Include sitzt, selbst mit position:absolute geht da nix.
Was gehen würde, wäre den Token auf der Index.php mit Formular zu erzeugen und dann auf eine komplett neue Seite per Form Action zu leiten die z.b. Search.php heißt.
Problem dabei wäre dann, wenn einer dann auf der Search.php erneut die Suche betätigt müsste erst wieder irgendwie zurück auf die Index.php geleitet werden, da die Search.php ja keine Tokens erzeugt.
Aber, da muss es doch noch eine schönere Lösung geben, wie ist das hier von Tutorials denn gemacht ? da ist die Suche auch ganz oben und Tokens hab ich auch im Quelltext entdeckt
Vielleicht weiß das ja einer
Ich hoffe Ihr konntet mir folgen, angestrebt ist also ein Suchfeld auf der Index.php ganz oben im Header sitzend was über Token gegen Hacks geschützt ist. Die Ausgabe der Suche soll dann in einer in der Index.php Includierten Seite erfolgen.Geändert von Starfox2007 (11.01.12 um 12:38 Uhr)
-
11.01.12 12:47 #11
Warum machst du es so kompliziert?
In deiner index erstellst du deinen Token und den schreibst du in eine Session-Variable. Diese Variable kannst du dann überall abfragen.
Und beim erstellen des Token prüfst du einfach ob er schon in der Session existiert:
PHP-Code:
if(isset($_SESSION['token']) && $_SESSION['token'] != ''){
// token existiert
}else{
// token existiert nicht und muss erstellt werden
}
Die Schweine von heute sind unsere Schnitzel von morgen!
-
11.01.12 13:00 #12
Ja das ist ne Möglichkeit die ich noch gar nicht in betracht gezogen habe.
Wenn ich dann das Formular geschickt habe kann ich ja den Token dann mit Unset zerstören und es wird wieder ein neuer generiert weil er ja dann nicht mehr gesetzt ist.
Werd ich heute Abend mal probieren, big Thx Maniac.
-
11.01.12 14:26 #13
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Das wäre dann im Grunde auch das was ich dir in meinem Beitrag "8" geschrieben habe!
Innerhalb der Funktion kannst du doch auch einfach prüfen ob $_POST['submit'] vorhanden ist, also die Seite durc h anklicken des Buttons aufgerufen wurde. In diesem Fall darf der Wert nicht neu erstellt werden.Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
11.01.12 22:18 #14
@Tombe, Ja irgendwie hab ichs erst jetzt so richtig realisiert.
Es funktioniert jetzt soweit, was mich jetzt nur noch ein bisschen stutzig gemacht hat das ein Formular Reload in diesem Fall doch möglich ist.
Index.php
So Token ist in der Session und im Input FeldPHP-Code:<?php
session_start();
function generateToken() {
return md5(md5(uniqid().uniqid().mt_rand()));
}
if(isset($_SESSION["token"]) && !empty($_SESSION["token"])) {
// Token existiert
}else{
$_SESSION["token"] = generateToken();
}
$token = $_SESSION["token"];
?>
<form action="./index.php?page=search" method="post">
<div class="searchbar">
<input type="text" name="search" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" name="submit" />
</div>
</form>
search.php <-- die ja in die Index Includiert wird.
Wenn ich jetzt Reload mache übermittelt er einen neuen Token in Session und in Input Feld, was wenn ich 2 separate Seiten hätte so nicht der Fall wäre sondern hier würde dann das Script beendet.PHP-Code:if (!isset($_SESSION["token"]) && !isset($_POST["token"]) && ($_SESSION["token"] !== $_POST["token"])) {
// Externer Aufruf
// Token ungültig machen
unset($_SESSION["token"]);
// Script beenden
exit;
}
// Token ungültig machen
unset($_SESSION["token"]);
// Formular verarbeiten
Geändert von Starfox2007 (11.01.12 um 22:21 Uhr)
-
12.01.12 07:43 #15
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Du arbeitest immer noch mit der zusätzlichen Variable $token. Diese ist meiner Meinung nach überflüssig weil du doch den Token in der Variablen $_SESSION["token"] hast.
Die Prüfung mit dem IF-Block dürfte (so wie ich es verstehe) auch falsch sein. Du prüfst auf den Wert $_POST["token"] aber du solltest prüfen ob der Submit-Button angeklickt wurde -> $_POST["submit"].
Wobei ich irgendwo im Hinterkopf eine Erinnerung daran habe das es manchmal Probleme gibt wenn der Submit-Button den Namen "submit" hat!?
Wenn ich da jetzt was falsche verstehe, dann erkläre bitte nochmal was jetzt klappt und was nicht.Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
Ähnliche Themen
-
Formular Token Problem
Von starfoxfs im Forum PHPAntworten: 5Letzter Beitrag: 20.09.09, 12:33 -
session token
Von inspector_71 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 28.10.07, 11:01 -
Syntax error on token ")", delete this token
Von messmar im Forum JavaAntworten: 4Letzter Beitrag: 03.10.07, 02:37 -
token
Von benni miles im Forum C/C++Antworten: 1Letzter Beitrag: 01.04.07, 21:25 -
ungültiger Token
Von 123arne im Forum .NET Windows FormsAntworten: 3Letzter Beitrag: 12.10.05, 13:58





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren