PHP über JS sicher abrufen
lima-city → Forum → Die eigene Homepage → HTML, CSS & Javascript
aktion
alphabet
code
datenbank
erstellen
fehler
fehlermeldung
funktion
grund
index
kaufen
rand
server
session
string
tab
update
url
zahl
zeichen
-
Hallo hackyourlife und hcms,
hackyourlife schrieb:
thwbm schrieb:
Ja, genau das bedeutet es
Bedeutet diese Zeile:
$string .= $alphabet[rand(0, 62 - 1)];
jetzt etwa, dass er sich ein zufälliges Zeichen aus dem String $alphabet nehmen soll, wobei das Zeichen das erste Zeichen, aber auch das 62ste oder auch eins dazwischen sein kann?
Ah, ok, jetzt wird mir so einiges klar, danke!
hcms schrieb:
hi,
auch mit session und authcode bist du nicht auf der sicheren seite... schließlich sind beide vor einer aktion im browser verfügbar - es ist also kein problem den sessioncode und auch fortlaufend zurückgegebene authcodes für automatisierte anfragen zu benutzen/missbrauchen.
ich denke die einzig wahre sache wäre wirklich bei jedem aufruf serverseitig zu prüfen ob die aktion auch erlaubt ist (z.b. beim kaufen: ist der gegenstand verfügbar ? hat der user genug geld ? etc...)
Wie hackyourlife schon sagte, hast du das nicht richtig verstanden, aber er hat es ja schon erklärt.
hackyourlife schrieb:
Was aber das hier besprochene Angriffsszenario nicht verhindert. Natürlich muss es dieses System ebenfalls geben, denn sonst kann der User selbst cheaten! Beides schützt aber nicht vor einem Bot, falls du das meinst?
Dafür habe ich bereits gesorgt, es wird an hand der ID des Gegenstands der Preis ermittelt und an hand der Benutzer ID das vorhandene Geld, und nur wenn der Gegenstand billig genug ist wird die Aktion durchgeführt.
Eins habe ich aber immernoch nicht verstanden. Woher weiß die Update.php welcher der richtige Token ist? In der Index.php wird er generiert (
) und mit GET an die Update.php gesendet, aber woher weiß die Update.php welcher Token in diesem Moment richtig ist?include('auth.php');
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
thwbm schrieb:
Die Lösung steht in der
Eins habe ich aber immernoch nicht verstanden. Woher weiß die Update.php welcher der richtige Token ist? In der Index.php wird er generiert (
) und mit GET an die Update.php gesendet, aber woher weiß die Update.php welcher Token in diesem Moment richtig ist?include('auth.php');
auth.php
Der Token wird in einer Session gespeichert, und die ist in der
die gleiche wie in derupdate.php
(und auch in allen anderen PHP-Scripten), deshalb funktioniert das.index.php
-
hackyourlife schrieb:
Der Token wird in einer Session gespeichert, und die ist in der
die gleiche wie in derupdate.php
(und auch in allen anderen PHP-Scripten), deshalb funktioniert das.index.php
Jetzt hab ich es gesehen und verstanden. Aber aus irgendeinem Grund kommt die Fehlermeldung
.Es trat ein Fehler auf. Session abgelaufen? Versuch es erneut!
Das heißt, dass es einen Fehler bei der Verarbeitung aufgetreten ist. Ich kann nicht einmal 10 mal hintereinander auf den Link klicken, da ich sonst die Fehlermeldung bekomme. Ich sehe aber nicht so recht den Grund dafür, denn meistens funktioniert das Update ja auch einwandfrei. Ich habe es mal mit einer Test-Tabelle verbunden, und gesehen, dass auch wenn keine Fehlermeldung kommt das
Update nicht immer ausgeführt wird. Wodran kann das liegen?
MFG THWBM -
thwbm schrieb:
Das kann vorkommen, wenn du die Seite in 2 Tabs offen hast, in einem auf den Link klickst und dann im anderen Tab ebenfalls…
Jetzt hab ich es gesehen und verstanden. Aber aus irgendeinem Grund kommt die FehlermeldungEs trat ein Fehler auf. Session abgelaufen? Versuch es erneut!
Derzeit musst du wenn die Meldung kommt 1x auf den Link klicken nur um einen neuen Auth-Code anzufordern und erst beim nächsten Klick wird die Aktion ausgeführt… das habe ich jetzt auch noch ausgebessert.
index.php:<?php include('auth.php'); // Auth-Token zum 1. Mal erstellen $token = generateAuthToken(); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"> <head> <title>Sicherheit mit AJAX</title> <script type="text/javascript"><!-- var authtoken = '<?php echo($token); ?>'; // hier wird der Auth-Token gespeichert function createXMLHttpRequest() { if(window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari return new XMLHttpRequest(); } else { // code for IE6, IE5 return new ActiveXObject("Microsoft.XMLHTTP"); } } function datenbankupdate(data) { var request = createXMLHttpRequest(); request.open('GET', 'update.php' + data, false); request.send(); // Anfrage senden // speicher den neuen Auth-Token var data = JSON.parse(request.responseText); authtoken = data.token; if(data.status == 'ERR') alert('Es trat ein Fehler auf. Session abgelaufen?\nVersuch es erneut!'); } // --></script> </head> <body> <p><a onclick="datenbankupdate('?ID=123&token=' + authtoken)" href="#">Datenbank updaten</a></p> <p><input type="button" name="update" value="Datenbank updaten" onclick="datenbankupdate('?ID=123&token=' + authtoken)" /></p> </body> </html>
update.php:<?php include('auth.php'); header('content-type: text/plain'); $token = $_GET['token']; function newToken($status = 'OK') { $token = generateAuthToken(); $data = json_encode(array( 'token' => $token, 'status'=> $status )); return($data); } // im Fehlerfall einen neuen Token erstellen if($token == 'ERR') { die(newToken('ERR')); } // gibt es überhaupt einen Auth-Token? if(!hasAuthToken()) { die(newToken('ERR')); } // stimmt der Auth-Token? if(validateAuthToken($token)) { // neuen Auth-Token erstellen echo(newToken()); // mach deine Aktion $id = $_GET['ID']; // hier kannst du die DB updaten // Beispiel: Click-Counter touch('counter.txt'); file_put_contents('counter.txt', file_get_contents('counter.txt') + 1); exit(); } else { die(newToken('ERR')); } ?>
Dabei wird immer der Fehlercode und der neue Auth-Code mitgeschickt, also auch im Fehlerfall, was bisher nicht der Fall war. -
Vielen dank an alle, die mir geholfen haben. Ich habe das Script jetzt noch auf meine Bedürfnisse angepasst und jetzt kommen auch keine Fehlermeldungen mehr. Danke!
hackyourlife schrieb:
thwbm schrieb:
Jetzt hab ich es gesehen und verstanden. Aber aus irgendeinem Grund kommt die Fehlermeldung
Es trat ein Fehler auf. Session abgelaufen? Versuch es erneut!
Das kann vorkommen, wenn du die Seite in 2 Tabs offen hast, in einem auf den Link klickst und dann im anderen Tab ebenfalls?
2 Tabs wären zwar eine gute Erklärung, aber ich hatte nur einen Tab mit der Seite offen. Woran es lag, weiß ich nicht, aber mit meiner Anpassung funktioniert es jetzt.
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage