Reloadsperre bzw URL löschen

ich schreibe webshop. wenn man ein Produkt in den warenkorb legt dann läuft dass bei mir per GET - was so viel heißt, dass wenn man die seite nochmal aufruft oder per backspace etc, dann hat man das Produkt nochmal drin etc etc...

Nun nöchte ich eine Art reloadsperre oder was dergleichen machen, damit das nicht passieren kann. Man sollte die Seite schon refreshen oder mittel zurück aufrufen lönnen, aber dabei sollte man nicht nochmal was unabsichtleich bestellen.

Wie kann ich das am besten realisieren? Wenn ich einfach beim seiten aufruf die URL sutzte bringt das ja nix, oder?
 
hmmm, persönlich würde ich das per post machen und, nachdem es in den warenkorb eingetragen ist, die einzelnen variablen wieder leeren. ob du da per get ne lösung findest kann ich mir im augenblick nicht so ganz vorstellen
 
geht das per POST? hal in meinem Fall...
weil, ich hab einen Link der
href="gleicheseite.php?inwarenkorb=TRUE&ID=[produktID]"
kann man das in POST umschrieben?

Weil ich hab jetzt ein neues/nächstes Problem...er haut mir alles zweimal rein - aber nur der Firefox, auch nach "Daten löschen".
Ich schieb da einfach GET alles in die Schuhe, aber muss doch eine Lösung geben, oder?
 
joa, sollte gehen. vielleicht postet du mal ein stück aus der datei, die deine artikel anzeigt und wo dann in den warenkorb eingetragen wird. da kann man dir dann bestimmt schneller tips geben
 
PHP:
<?
session_start();
$db=mysql_connect("xxxxx");
$datenbank="xxxx";

//Hier wird das übergebgene Produkt in den Warenkorb gelegt
if($inwarenkorb){
	if($_SESSION[warenkorb][$ID]){
		$_SESSION[warenkorb][$ID]++;
	}else{
		$_SESSION[warenkorb][$ID]=1;
	}
foreach($_SESSION[warenkorb] as $key=>$val){
	$SQL="SELECT * FROM produkte WHERE ID='".$key."'";
	$res=mysql_db_query($datenbank,$SQL);
	$ausgabe=mysql_fetch_array($res);
	${$key}[preis]=$ausgabe[preis];
}
$_SESSION[summe]=0;
foreach($_SESSION[warenkorb] as $key=>$val){
	$_SESSION[summe]=$_SESSION[summe]+${$key}[preis]*$val;
}
}

include("header.php");

if(!$ID){
	echo "Keine Variable übergeben!";
}else{
	$SQL="SELECT * FROM `produkte` WHERE `ID`='".$ID."'";
	$res=mysql_db_query($datenbank,$SQL);
	$produkt=mysql_fetch_array($res);
	$titel=$produkt[name];
	$bild=$produkt[bildpfad];
	$angaben=$produkt[beschreibung];
?>
<table width="540" border="0" cellspacing="5" cellpadding="0">
  <tr>
    <td><img src='<? echo $bild ?>' width="300"></td>
    <td width="255" valign="top">
	<h3><? echo $titel ?></h3>
	<? echo $angaben ?>
	</td>
  </tr>
  <tr>
    <td colspan="2"><a href="details.php?inwarenkorb=TRUE&ID=<? echo $ID ?>">In den Einkaufswagen</a></td>
  </tr>
</table>

<?
}
include("footer.php"); ?>

Dass wärs in groben Zügen:
Link wo per GET ID und tusindeneinkaufswagenbefehl übergeben werden ruft die eigene Seite auf
Oben auf der seite wird dann alles in die Sessionvariable geschrieben
 
also so wie ich das verstehe, steht auf der seite nur ein produkt mit der ID und du hast dann unten einen link um das in den warenkorb zu legen.

ich würde jetzt einfach ein formular anlegen und hidden fields erstellen mit dem was du benötigst. also ID und dann noch sowas wie nen status, also inwarenkorb bei dir. oben auf der seite fragst du eigentlich genauso ab wie jetzt schon., nach dem speichern nach $_SESSION machst du $_POST['inwarenkorb'] = false oder wie du das dann genau verwenden willst.

einen tip habe ich noch, so wie du das machst, muss in php register_globals = on sein. davon würde ich niemals ausgehen, da davon auch abgeraten wird. mache deine abfrage also nicht in der art: if($inwarenkorb) { ... sondern so: if($_POST['inwarenkorb']) bei sachen die per post übertragen werden und $_GET['...'] für sachen, die du per get überträgst (also id wenn du die seite aufrufst).

letztendlich sind das nicht so viele änderungen und es sollte funktionieren wie du es dir vorstellst
 
Du könntest in der Session-Variable eine zufällige Zeichenfolge speichern, und die dann an den GET-Aufruf anhängen. Beim Einstellen in den Warenkorb überprüfst du dann einfach die beiden Zeichenfolgen und speicherst eine neue.

Außerdem solltest du dich (vor allem bei einem Webshop) mal mit Sicherheit beschäftigen. Die Sicherheitslücken, die mir jetzt direkt in deinem Code auffallen, sind, dass du keine einzige Variable überprüfst (SQL-Injection etc.), und dass du Register-Globals eingeschaltet hast. Damit kann jeder einfach per POST sämtliche Variablen manipulieren, denen du keinen Wert zugewiesen hast.
Beispiel:
PHP:
if($passwort == "xxx") {
    $ok = true;
}
...
if($ok)  {
    ...
}
Jeder könnte jetzt einfach per GET oder POST ok=true übergeben, und wäre automatisch angemeldet, ohne das Passwort zu kennen.
 
OK danke, ich werd's so umändern. Das mit der Sicherheit ist sowieso noch nicht gemacht, d.h. ich hab mir schonmal aus irgendeinem anderen thread hier schonmal zusammengechrieben was man beachten sollte und dass dann aber erst im nachhinein einbauen. Erst soll das Dingüberhaupt einmal laufen...
Vielen Dank!
 
sicherheit sollte man am anfang haben und erst dann die einzelnen anderen funktionen hinzufügen ;-) weil du später immer was übersehen wirst, was noch geprüft werden muss
 
Original von jami
OK danke, ich werd's so umändern. Das mit der Sicherheit ist sowieso noch nicht gemacht, d.h. ich hab mir schonmal aus irgendeinem anderen thread hier schonmal zusammengechrieben was man beachten sollte und dass dann aber erst im nachhinein einbauen. Erst soll das Dingüberhaupt einmal laufen...
Vielen Dank!

jani, wenn du das Produkt über die URL mitgibst, ist ja wohl klar, dass diese bei jedem Aufruf den Bestand im Warenkorb inkrementiert - du MUSST das mit post machen, sonst brauchst du eine Extra-Funktion die das wieder leert etc. - das ist weder peformant noch clever.

Ansonsten schliesse ich mich meinem Vorposter an - erst den Topf, dann die Zutaten.

Warum benutzt du nicht einen FORM-Tag? Man kann den Buttons auch Bilderchens geben -> css4you.de

Um dieses "wollense de Daten nochma senden" weitgehend zu vermeiden kannst du die Seite NACH dem Einfügen in den Warenkorb sich selbst neu laden lassen -> header("location....); - dann gibt es nämlich keine post-Daten mehr.

War das soweit verständlich oder zuviel Kauderwelsch auf einmal?
 
gar keine post-daten wäre nicht so günstig so wie er die seite aufgebaut hat. es scheint eine übersicht über alle produkte zu geben und dann geht er auf eine seite mit einem speziellen produkt und da kann man dies auch in den warenkorb legen (das ist der gepostete code). da wird das produkt aber erstmal per get übergeben, da es bei einem link ja auch leichter zu machen ist.
mit dem header("location...") wäre das get ja nun auch nicht unbedingt mehr vorhanden außer er kann wieder das get mit übergeben. ansonsten halt einfach ein flag benutzen wie ich es beschrieben habe. das sollte gehen.
 
Soo...

hab das jetzt geändert. Wodurch gleich eine handvoll Fragen aufgekommen sind...

1.) Is GET generelle "nicht so gut"? Weil ich hab fast alle kleineren Anfragen wie Anzahl erhöheh, Übergabvariablen etc per GET übergeben...

2.)Zu Eydeet Un/Sicherheitsdemonstration: ich hab das nicht ganz gecheckt ob man die Variablen jetzt manipulieren kann weil A) keine Var-Überprüfung oder B) die Register_Globals oder C) beides

3.) Wegen SQL-I hab ich mir schon Gedanken gemacht, nur bin ich mir noch nicht ganz sicher wie genau ich vorgehen soll.
Ich hab nämlcih auch Felder wo zB Benutzereingaben etc eingegeben werden, wodurch meines erachtens auch noch anderen Risiken entstehen...
Mein Resultat: strip_tags damit keiner irgendwie Code reinschmuggelt und mysql_real_escape_string hat mir Wikipedia geflüstert...
Würde das reichen wenn ich bei jeder Eingabe mit den zwei Dingen drüber bügle?

4.) Das mit den RegisterGlobals is jetzt blöd weil ich natürlich jetzt zigtausend seiten habe wo ich das ändern müsste. Riecht es wenn ich jetzt auf jeder seite am Anfang einfach
$var=$_POST/GET[var]
deklariere, oder verfehlt dass ddann erst recht wieder seinen Sinn?
 
zu 1) POST verwendet man für Formulareingaben, oder wenn der Besucher bestimmte Werte nicht in der Adressleiste sehen soll. Da GET einfacher zu implementieren ist, wird es meistens für alle anderen Fälle verwendet.
Eine "Reload-Sperre" musst du auch bei POST einbauen, der einzige Unterschied ist, dass der Browser fragt, bevor er die POST-Werte nochmal versendet.

zu 2) Das war eine Demonstration für die Gefährlichkeit von Register-Globals. Der Besucher kann halt sämtliche Variablen verändern, die nicht vorher mit einem Wert belegt wurden. Mein Beispiel zeigt einen möglichen Fall dafür.

zu 3) Du solltest Benutzer-Eingaben so weit wie möglich per White-List prüfen (preg_match). In eine Kontonummer sollten z.B. nur 7? Zahlen:
PHP:
if( preg_match("[\d]{7}", $_POST["kontonummer"]) ) {
    $knr = $_POST["kontonummer"];
} else {
    die("Ungültige Kontonummer!");
}
mysql_real_escape_string ist das einfachere, aber auch nicht so wirkungsvolle Mittel gegen SQL-Injections.

zu 4) Das ist komplett sinnlos, da du damit nur die Variablen mit sich selbst überschreibst.
Das Problem ist ja, dass der Besucher Variablen belegen kann, von denen du gar nicht erwartest, dass sie irgendwie verändert werden können, da sie in keinem Link oder Formular namentlich genannt sind. Der Benutzer braucht dann allerdings Kenntnisse über deinen Quellcode, oder er muss raten.
 
ok ok...
Hab mal alles in $_GET/POST.. Form umgeändert. Zwecks der Reloadsperre wollte ich dass so machen wie lightsaver es vorgeschlagen hat...nur etwas anders...

PHP:
if($_POST[inwarenkorb]){
	unset($_POST[inwarenkorb]);

weiß nicht ob ich das richtig verstanden hab, so hab ich es nämlcih schonmal früer probiert und siehe da, es funzt nicht...

blöd oder falsch?

zur SQL-Injektion:
Also du meinst ich sollte das jedes mal per regulären Ausdruck überprüfen oder wie das heißt?
 
Nein...das ist nur ein "aktivierungs-variable", die ist nur entweder gesetzt oder nicht, danach brauch ich sie nicht mehr

Aber es sollte doch so funktionieren, oder? Weil ich kann trotzdem noch die Seite reloedan und er tut wieder was rein
 
Es hilft nichts, wenn du die Variable in deinem PHP-Skript "unsettest", denn sie ist ja immer noch im Browser des Clients gespeichert und wenn der Client die Seite erneut aufruft, werden die POST_Variablen erneut an das PHP-Skript geschickt. Was ich sagen will ist, dass du nicht von deinem PHP-Skript aus die Variablen aus dem Browser des Clients löschen kannst, PHP ist ja schließlich eine serverseitige Sprache.

btw: Die Idee mit der zufälligen Zeichenfolge von Eydeet gefällt mir gut, diese würde ich an deiner Stelle benutzen
 
Zurück
Oben