kostenloser Webspace werbefrei: lima-city


PHP über JS sicher abrufen

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    Hallo hackyourlife und hcms,
    hackyourlife schrieb:
    thwbm schrieb:
    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?
    Ja, genau das bedeutet es ;-)

    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 (
    include('auth.php');
    ) und mit GET an die Update.php gesendet, aber woher weiß die Update.php welcher Token in diesem Moment richtig ist?
    MFG THWBM
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    thwbm schrieb:
    Eins habe ich aber immernoch nicht verstanden. Woher weiß die Update.php welcher der richtige Token ist? In der Index.php wird er generiert (
    include('auth.php');
    ) und mit GET an die Update.php gesendet, aber woher weiß die Update.php welcher Token in diesem Moment richtig ist?
    Die Lösung steht in der
    auth.php
    ;-)

    Der Token wird in einer Session gespeichert, und die ist in der
    update.php
    die gleiche wie in der
    index.php
    (und auch in allen anderen PHP-Scripten), deshalb funktioniert das.
  4. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    hackyourlife schrieb:
    Der Token wird in einer Session gespeichert, und die ist in der
    update.php
    die gleiche wie in der
    index.php
    (und auch in allen anderen PHP-Scripten), deshalb funktioniert das.

    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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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…

    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&amp;token=' + authtoken)" href="#">Datenbank updaten</a></p>
    		<p><input type="button" name="update" value="Datenbank updaten" onclick="datenbankupdate('?ID=123&amp;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.
  6. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!