SafetyFirst: Unmanipulierbares Quiz mit Stoppuhr

Hallo ihrs,

ich möchte gern ein Quiz mit mehreren Fragen entwickeln. An sich simpel mit PHP und ner DB. Nun habe ich aber zwei Probleme:

1. Zum einen soll das Quiz ohne Zwischenladen ablaufen, d.h. eine schlechte Online-Verbindung soll die gestoppte Zeit nicht beeinflussen.
2. Die Zeit soll (wie erwähnt) gestoppt werden und natürlich soll es nicht möglich sein, diese zu manipulieren.

Nun dachte ich, das Ganze mit Javascript zu lösen und entsprechend vorzuladen (die Zeit, die Fragen, usw.). Aber das läuft ja dann auf dem Client und schreit doch danach, manipuliert zu werden, oder?

Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

Grüße und Dank im Voraus, Jochen

  1. Hi,

    Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

    a) Ja
    b) Manipuliert als Default ansehen und ein Script so schreiben, dass eine Manipulation(für dein Quiz) egal wäre, also keine Auswertung möglich.

    Hans

    1. Hi,

      Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

      a) Ja
      b) Manipuliert als Default ansehen und ein Script so schreiben, dass eine Manipulation(für dein Quiz) egal wäre, also keine Auswertung möglich.

      Hans

      Hm, erstmal danke - aber ich muss zugeben, bei b) versteh ich nur Bahnhof....?!

    1. Zum einen soll das Quiz ohne Zwischenladen ablaufen, d.h. eine schlechte Online-Verbindung soll die gestoppte Zeit nicht beeinflussen.
    2. Die Zeit soll (wie erwähnt) gestoppt werden und natürlich soll es nicht möglich sein, diese zu manipulieren.

    Nun dachte ich, das Ganze mit Javascript zu lösen und entsprechend vorzuladen (die Zeit, die Fragen, usw.). Aber das läuft ja dann auf dem Client und schreit doch danach, manipuliert zu werden, oder?

    Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

    Hallo du,
    Ich habe zwar von der praktischen Umsetzung umsetzung keine Ahnung, aber mit der Zeitmanipulation hast du recht, das müsstest du serverseitig lösen.
    Jeder bekommt eine (session)-ID, und Anfangs - und - Endzeit müssten serverseitig gespeichert und ausgewertet werden

    g johannes

  2. Hallo,

    ein Quiz mit mehreren Fragen

    1. Zum einen soll das Quiz ohne Zwischenladen ablaufen, d.h. eine schlechte Online-Verbindung soll die gestoppte Zeit nicht beeinflussen.

    Dann musst du _alle_ Fragen an den Client schicken und dort entweder alle anzeigen oder mit Javascript nach und nach einblenden.

    1. Die Zeit soll (wie erwähnt) gestoppt werden und natürlich soll es nicht möglich sein, diese zu manipulieren.

    Du bestimmst den Startzeitpunkt. Entweder automatisch bei onLoad oder nach Klick auf einen Button. Das Startzeichen wird per Ajax an den Server geschickt, die Zeit dazu auf dem Server gespeichert.

    Nun dachte ich, das Ganze mit Javascript zu lösen und entsprechend vorzuladen (die Zeit, die Fragen, usw.). Aber das läuft ja dann auf dem Client und schreit doch danach, manipuliert zu werden, oder?

    Was weiss, ich, was für Clients es gibt. Mit stehengebliebener Uhr vielleicht?

    Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

    Naja, beim Endzeitpunkt wird wieder ein Mini- Telegramm an den Server geschickt und du hast serverseitig die Zeit ermittelt.

    Bei gleichmässig schlechter Leitung kommt das Start- und Ende- Zeichen um dieselbe Zeit verzögert an, macht also nichts.

    LG Kalle

    1. Hallo,

      ein Quiz mit mehreren Fragen

      1. Zum einen soll das Quiz ohne Zwischenladen ablaufen, d.h. eine schlechte Online-Verbindung soll die gestoppte Zeit nicht beeinflussen.

      Dann musst du _alle_ Fragen an den Client schicken und dort entweder alle anzeigen oder mit Javascript nach und nach einblenden.

      1. Die Zeit soll (wie erwähnt) gestoppt werden und natürlich soll es nicht möglich sein, diese zu manipulieren.

      Du bestimmst den Startzeitpunkt. Entweder automatisch bei onLoad oder nach Klick auf einen Button. Das Startzeichen wird per Ajax an den Server geschickt, die Zeit dazu auf dem Server gespeichert.

      Nun dachte ich, das Ganze mit Javascript zu lösen und entsprechend vorzuladen (die Zeit, die Fragen, usw.). Aber das läuft ja dann auf dem Client und schreit doch danach, manipuliert zu werden, oder?

      Was weiss, ich, was für Clients es gibt. Mit stehengebliebener Uhr vielleicht?

      Wär toll, wenn ihr Hilfe wüsstet a) ob meine Vermutung der Manipulierbarkeit stimmt und b) ob es denn eine bessere und manipulierfreiere Implementierung vorschlagen würdet?

      Naja, beim Endzeitpunkt wird wieder ein Mini- Telegramm an den Server geschickt und du hast serverseitig die Zeit ermittelt.

      Bei gleichmässig schlechter Leitung kommt das Start- und Ende- Zeichen um dieselbe Zeit verzögert an, macht also nichts.

      LG Kalle

      Also das mit dem Javascript (s. 1.) und auch das mit dem serverseitigen Stoppen der Zeit (s. Johannes) find ich gut...!

      Zu 2: Hast du nen Tipp, Kalle, wo ich am besten nachschauen kann, wie man sowas per Ajax löst (muss jetzt hoffentlich nicht Ajax von der Pike auf lernen, oder?)...?

      Grüße, Jochen

      1. Hoi!

        Ich dachte Du wolltest es unmanipulierbar machen? Komischer Ansatz zu sagen, auf Javascript zu verzichten und dann mit Ajax (Javascript) zu arbeiten...

        Dein Problem ist so nicht lösbar, da es Dir ja scheinbar auf jede (Milli-)Sekunde ankommt. Wenn Du eine Serverseitige Auswertung nicht machen möchtest, weil Die die Transferzeiten zu unregelmässig sind, musst Du wohl auf Dein Vorhaben verzichten.

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
      2. Hallo Jochen,

        Zu 2: Hast du nen Tipp, Kalle, wo ich am besten nachschauen kann, wie man sowas per Ajax löst (muss jetzt hoffentlich nicht Ajax von der Pike auf lernen, oder?)...?

        Du brauchst auf demselben (wichtig, sonst funzt Ajax nicht) Server abc.de ein PHP- Programm, das per Ajax aufgerufen wird, nennen wir es mal zeitnahme.php

        Ajax selbst ist recht pflegeleicht:

          
            var http = createRequestObject();  
            function createRequestObject()  
            {  
              var objAjax;  
              var browser = navigator.appName;  
              if(browser == "Microsoft Internet Explorer"){  
                objAjax = new ActiveXObject("Microsoft.XMLHTTP");  
              }else{  
                objAjax = new XMLHttpRequest();  
              }  
              return objAjax;  
            }  
            var programm = "http://abc.de/zeitnahme.php?start=1";  
            http.open("get", programm );  
            http.onreadystatechange = updateNewContent;  
            http.send(null);  
          
            function updateNewContent()  
            {  
              if(http.readyState == 4)  
              {  
                var antwort = http.responseText; // Antwort unwichtig  
              }  
            }
        

        Und beim Ende rufst du dasselbe Programm auf mit ?ende=1

        Falls du mehrere User gleichzeitig erwartest, musst du einen weiteren Parameter übergeben, der den User kennzeichnet.

        LG Kalle

        1. Hallo Jochen,

          »» Zu 2: Hast du nen Tipp, Kalle, wo ich am besten nachschauen kann, wie man sowas per Ajax löst (muss jetzt hoffentlich nicht Ajax von der Pike auf lernen, oder?)...?

          Du brauchst auf demselben (wichtig, sonst funzt Ajax nicht) Server abc.de ein PHP- Programm, das per Ajax aufgerufen wird, nennen wir es mal zeitnahme.php

          Ajax selbst ist recht pflegeleicht:

          var http = createRequestObject();
              function createRequestObject()
              {
                var objAjax;
                var browser = navigator.appName;
                if(browser == "Microsoft Internet Explorer"){
                  objAjax = new ActiveXObject("Microsoft.XMLHTTP");
                }else{
                  objAjax = new XMLHttpRequest();
                }
                return objAjax;
              }
              var programm = "http://abc.de/zeitnahme.php?start=1";
              http.open("get", programm );
              http.onreadystatechange = updateNewContent;
              http.send(null);

          function updateNewContent()
              {
                if(http.readyState == 4)
                {
                  var antwort = http.responseText; // Antwort unwichtig
                }
              }

          
          >   
          > Und beim Ende rufst du dasselbe Programm auf mit ?ende=1  
          >   
          > Falls du mehrere User gleichzeitig erwartest, musst du einen weiteren Parameter übergeben, der den User kennzeichnet.  
          >   
          > LG Kalle  
            
          Danke dir - das gibt mir zumindest mal einen Einblick in Ajax. Ich glaub ich werd mich da beizeiten doch ein bisschen reinarbeiten, das sieht mir eigentlich ganz sinnig aus (und bietet ja angeblich ganz neue Perspektiven)....  
          Allerdings verzichte ich diesmal aus Sicherheitsgründen nun doch auf eine nicht-serverseitige Lösung und nehme die geringen Zeit-Varianzen in Kauf.  
            
          Dank dir (und euch anderen) für Hilfe und Kommentare!  
          Grüße, Jochen