Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mettre du php dans une condition javascript

update d'un champ

Sujet résolu
    13 septembre 2010 à 20:05:19

    Bonsoir,

    Ce problème un peu spécial est dû au besoin de sécuriser un jeu javascript (Lire ce topic pour en savoir plus.)
    Suite à cet ancien topic j'utilise toujours la même sécurité qui reste contournable même si elle est chiante (le tricheur doit à chaque fois reprendre le nouvel id).
    J'ai réfléchi à quelque chose : mettre un champ à 1 grâce à un update en php dans une partie javascript du jeu où la collision est détectée, ainsi je suis sûr qu'on ne peut plus tricher, j'ai donc essayé ça sur jeu.php :

    if (touch == 1) { // partie js où la collision a été détectée
    stop(); reset();
    <?php mysql_query("UPDATE joueurs SET joueur_verif='1' WHERE joueur_pseudo='".$_COOKIE['auth']."'"); ?> // mise à jour d'un champ joueur_verif
    }
    


    Donc si le tricheur veut mettre un temps en l'entrant dans l'url ce sera refusé car le champ ne sera pas à 1 vu qu'il n'aura pas véritablement joué et donc pas cogné.
    Cependant j'ai testé cette méthode et elle ne fonctionne pas, j'ai juste à actualiser la page jeu.php et le champ se met à 1 sans même devoir jouer et donc cogner.
    L'instruction php d'update est exécutée même si la condition js n'est pas respectée..
    Que dois-je faire pour enfin réussir à protéger mon jeu de manière efficace ? Si possible une solution simple (je n'ai pas comprise celle proposée sur l'ancien topic).

    Merci de votre réponse, :)

    Craw
    • Partager sur Facebook
    • Partager sur Twitter

    Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

      13 septembre 2010 à 21:33:04

      Envoie une requête ajax vers une page php, qui contiendra ta requête :)
      • Partager sur Facebook
      • Partager sur Twitter
        13 septembre 2010 à 21:55:42

        Oui mais on pourra tricher, il suffira que l'utilisateur se rende sur la page pour enclencher la requête non ? Comment cacher le fichier du coup, sachant que certains outils permettent de fouiller un site ?
        • Partager sur Facebook
        • Partager sur Twitter

        Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

          13 septembre 2010 à 22:49:56

          Hum, ce que je te conseille de faire, c'est de mettre un token après chaque action ajax.
          En gros, dès que tu fais une requête ajax, tu appelles un minuscule fichier qui te renverra un token et qui le mettra en session. Ainsi, on ne pourra pas deviner ton token. Après, tu le transmet à la prochaine requête ajax, et tu vérifies si la variable transmise est bien celle en session.
          • Partager sur Facebook
          • Partager sur Twitter
            13 septembre 2010 à 23:00:05

            Ah mais un token c'est un nombre généré aléatoirement avec rand en php que je hash ensuite ?
            Pourrais-tu me présenter un exemple de code stp, car je ne vois pas trop la façon dont je pourrais m'y prendre. :)
            • Partager sur Facebook
            • Partager sur Twitter

            Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

              13 septembre 2010 à 23:14:02

              Hum, voilà comment je fais moi :

              <?php
              $_SESSION["token"] = sha1(uniqid(rand(), true));
              
              exit(json_encode(array("token" => $_SESSION["token"])));
              


              // Cette variable est déclarée dès la première ligne de js :
              var TOKEN;
              
              // Cette fonction est déclarée dans un fichier js à part
              function newToken() {
                $.ajax({
                  url: "gentok.php",
                  dataType: "json",
                  async: false,
                  success: function(r) { TOKEN = r[0]; }
                });
              }
              
              // Dans mon <head>, j'appelle newToken(), et après chaque requête ajax également.
              // Je transmet aussi la valeur du token :
              $.ajax({data: ({token: TOKEN, ...}),
                ...
                complete: function() { newToken(); }
              });
              


              <?php
              
              if ($_SESSION['token'] !== $_POST['token']) // POST ou GET, ça dépend de ton cas
                // ...
              


              J'utilise JQuery
              • Partager sur Facebook
              • Partager sur Twitter
                13 septembre 2010 à 23:22:01

                Oula, en fait je ne sais pas ce que c'est JQuery, enfin j'ai déjà vu, on ne peut pas faire tout ça juste avec du js normal et du php ? Car là je ne sais pas où placer ces bouts de code.
                • Partager sur Facebook
                • Partager sur Twitter

                Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                  13 septembre 2010 à 23:28:50

                  JQuery c'est juste un framework js. J'ai jamais vraiment appris le js, donc bon, je saurais pas t'en dire plus.
                  J'pense qu'il faut utiliser onreadystatechange de ton objet XHR.

                  Dans une requête ajax JQuery, les paramètres que j'ai mis correspondent à :

                  • url : l'url de la page à appeler
                  • datatype : le type des données que la requête te renvoit
                  • data : les requêtes à envoyer (en GET ou POST)
                  • async : passé à false, la requête sera synchrone
                  • success : quand la requête a réussi
                  • complete : quand la requête est terminée (réussite ou échec)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 septembre 2010 à 23:45:26

                    Ok donc j'ai installé JQuery en mettant le code du framework dans jquery.js
                    Voici ce que j'ai fait sur mes différentes pages :

                    <?php
                    $_SESSION["token"] = sha1(uniqid(rand(), true));
                    exit(json_encode(array("token" => $_SESSION["token"])));
                    ?>
                    


                    <?php
                    if ($_SESSION['token'] !== $_GET['token'])
                    {
                    echo 'Erreur.';
                    }
                    else
                    { 
                        include("identifiants.php");
                            mysql_connect($adresse, $nom, $motdepasse);
                            mysql_select_db($database);
                    		$requete1 = mysql_query('SELECT joueur_control
                            FROM joueurs WHERE joueur_pseudo = "'.$_COOKIE['auth'].'"') 
                            or die (mysql_error());
                            $data1 = mysql_fetch_assoc($requete1);
                    		$control = $data1['joueur_control'];
                    		$new_control = $control + 1;
                    mysql_query("UPDATE joueurs SET joueur_control='".$new_control."' WHERE joueur_pseudo='".$_COOKIE['auth']."'");
                    }
                    ?>
                    


                    Du côté du js :

                    function newToken() {
                      $.ajax({
                        url: "gentok.php",
                        dataType: "json",
                        async: false,
                        success: function(r) { TOKEN = r[0]; }
                      });
                    }
                    


                    Et dans la page du jeu :

                    // dans <head> :
                    <script type="text/javascript" src="jquery.js">
                    var TOKEN;
                    $.ajax({data: ({token: TOKEN, ...}),
                      ...
                      complete: function() { newToken(); }
                    });
                    </script>
                    
                    // ma requête ajax qui appelle control.php + l'appel de la fonction token
                    
                    var xhr=null;
                        
                        if (window.XMLHttpRequest) { 
                            xhr = new XMLHttpRequest();
                        }
                        else if (window.ActiveXObject) 
                        {
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                    	}
                    xhr.open("GET", "control.php", false);
                        xhr.send(null);
                    	$.ajax({data: ({token: TOKEN, ...}),
                      ...
                      complete: function() { newToken(); }
                    });
                    


                    Cela va marcher ? Désolé de toutes ces questions mais c'est la première fois que j'utilise JQuery. :-°
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                      13 septembre 2010 à 23:51:31

                      Ah nan, pas du tout :/
                      Les ..., c'était pour dire "des trucs inutiles pour l'exemple ici", déjà.
                      Ensuite, tu mélanges jquery et js, pas bon ça.

                      Tu n'as pas un onreadystatechange quelque part ? Montre ton code à l'origine.

                      (Je vais me coucher, je te répondrais demain, même si quelqu'un a posté entretemps ;) )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 septembre 2010 à 23:53:25

                        Oui j'ai ça dans jeu.php :

                        var xhr=null;
                            
                            if (window.XMLHttpRequest) { 
                                xhr = new XMLHttpRequest();
                            }
                            else if (window.ActiveXObject) 
                            {
                                xhr = new ActiveXObject("Microsoft.XMLHTTP");
                            }
                        xhr.open("GET", "control.php", false);
                            xhr.send(null);
                            $.ajax({data: ({token: TOKEN, ...}),
                          ...
                          complete: function() { newToken(); }
                        });
                        var xhr = getXMLHttpRequest();
                        xhr.onreadystatechange = function() {
                        //etc...
                        


                        J'ai gardé les fichiers en local et j'ai supprimé sur le FTP, j'attends d'être sûr que ça marche pour implémenter le système en ligne. :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                          14 septembre 2010 à 17:50:58

                          Donc, comme je te disais, non, ça ne marchera pas.
                          Utilise les requêtes ajax comme tu as l'habitude de faire, ça ne sert à rien de faire un affreux mélange avec jquery.
                          Dans ton onreadystatechange, quand tu sais que la requête a été exécutée, tu appelles ta fonction qui génère un nouveau token.
                          Refais toi-même cette fonction avec tes habitudes, ça sert à rien de reprendre mon code comme ça ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 septembre 2010 à 19:41:24

                            Bah je ne sais pas quoi faire, je ne connais pas du tout ça, je touche plus au PHP et au js comme ça quoi..
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                              14 septembre 2010 à 21:05:42

                              Montre une de tes actions ajax en entier (pas trop longue si possible), je te dirais où insérer et quoi comme code.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 septembre 2010 à 21:28:30

                                Ok merci.
                                Donc par exemple dans la partie où je détecte la collision avec le js j'appelle control.php chargée de mettre à jour un champ sql à 1 et justement on ne doit pas pouvoir le mettre à jour juste en allant sur cette page, il faut vraiment cogner :

                                if (touch == 1) {
                                stop(); reset();
                                var xhr=null;
                                    
                                    if (window.XMLHttpRequest) { 
                                        xhr = new XMLHttpRequest();
                                    }
                                    else if (window.ActiveXObject) 
                                    {
                                        xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                	}
                                xhr.open("GET", "control.php", false);
                                    xhr.send(null);
                                }
                                
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                  15 septembre 2010 à 18:19:28

                                  Alors, ta fonction newToken devrait ressembler à :

                                  function newToken() {
                                      var xhr=null;
                                  
                                      if (window.XMLHttpRequest) { 
                                          xhr = new XMLHttpRequest();
                                      }
                                      else if (window.ActiveXObject) {
                                          xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                      }
                                      
                                      xhr.onreadystatechange = function() {
                                          if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                              TOKEN = xhr.responseText;
                                          }
                                      };
                                      
                                      xhr.open("GET", "gentok.php", false);
                                      xhr.send(null);
                                  
                                  }
                                  


                                  Ensuite, dans ton code qui appelle ta page control.php, remplace xhr.send(null); par xhr.send(TOKEN); .
                                  Et rajoute ces lignes aussi :

                                  // Juste avant xhr.open("GET", "control.php", false);
                                  xhr.onreadystatechange = function() {
                                      if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                          newToken();
                                      }
                                  };
                                  


                                  Voilà, dis moi si ça marche ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 septembre 2010 à 18:59:16

                                    Merci mais ça ne fonctionne pas, à la collision le jeu n'affiche plus le classement et quand je vais sur control.php sans cogner pas d'erreur.

                                    Dans jeu.php j'ai ça :

                                    function newToken() {
                                        var xhr=null;
                                    
                                        if (window.XMLHttpRequest) { 
                                            xhr = new XMLHttpRequest();
                                        }
                                        else if (window.ActiveXObject) {
                                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                        }
                                        
                                        xhr.onreadystatechange = function() {
                                            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                                TOKEN = xhr.responseText;
                                            }
                                        };
                                        
                                        xhr.open("GET", "gentok.php", false);
                                        xhr.send(null);
                                    
                                    }
                                    // le code du jeu entre 2...
                                    
                                    if (finaltime == 0) { // si je cogne
                                    finaltime = calctime();
                                    window.alert('Score : ' + finaltime + ' seconde(s)');
                                    var xhr=null;
                                        
                                        if (window.XMLHttpRequest) { 
                                            xhr = new XMLHttpRequest();
                                        }
                                        else if (window.ActiveXObject) 
                                        {
                                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                        }
                                    xhr.open("GET", "control.php", false);
                                        xhr.send(TOKEN);
                                    var xhr = getXMLHttpRequest();
                                    xhr.onreadystatechange = function() 
                                     {
                                                        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) 
                                                            {
                                                                 document.getElementById('exp').innerHTML= xhr.responseText;
                                                                 afficherFenetre('exp'); // ça me permet d'afficher le classement
                                                                 newToken();
                                                            }
                                    //suite...
                                    


                                    Sur gentok.php :

                                    <?php
                                    $_SESSION["token"] = sha1(uniqid(rand(), true));
                                    
                                    exit(json_encode(array("token" => $_SESSION["token"])));
                                    ?>
                                    


                                    Sur control.php :

                                    <?php
                                    if ($_SESSION['token'] !== $_GET['token'])
                                    {
                                    echo 'Erreur.';
                                    exit();
                                    }
                                    else
                                    {
                                        include("identifiants.php");
                                            mysql_connect($adresse, $nom, $motdepasse);
                                            mysql_select_db($database);
                                    mysql_query("UPDATE joueurs SET joueur_control='1' WHERE joueur_pseudo='".$_COOKIE['auth']."'");
                                    }
                                    ?>
                                    


                                    Voilà merci de ta réponse, le problème doit se situer dans jeu.php je pense. :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                      15 septembre 2010 à 20:36:44

                                      T'as bien mis un var TOKEN; quelque part, et juste après réutiliser la fonction newToken ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 septembre 2010 à 20:42:03

                                        Le jeu refonctionne et le classement est affiché mais quand je vais sur control.php je peux mettre à jour le champ sans avoir joué.
                                        J'ai ça :

                                        var TOKEN;
                                        function newToken() {
                                            var xhr=null;
                                        
                                            if (window.XMLHttpRequest) { 
                                                xhr = new XMLHttpRequest();
                                            }
                                            else if (window.ActiveXObject) {
                                                xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                            }
                                            
                                            xhr.onreadystatechange = function() {
                                                if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                                    TOKEN = xhr.responseText;
                                                }
                                            };
                                            
                                            xhr.open("GET", "gentok.php", false);
                                            xhr.send(null);
                                        
                                        }
                                        
                                        //...
                                        if (finaltime == 0) { // si je cogne
                                        finaltime = calctime();
                                        window.alert('Score : ' + finaltime + ' seconde(s)');
                                        
                                        var xhr=null;
                                            
                                            if (window.XMLHttpRequest) { 
                                                xhr = new XMLHttpRequest();
                                            }
                                            else if (window.ActiveXObject) 
                                            {
                                                xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                            }
                                            xhr.onreadystatechange = function() {
                                            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                                newToken();
                                            }
                                        };
                                        
                                        xhr.open("GET", "control.php", false);
                                            xhr.send(TOKEN);
                                        var xhr = getXMLHttpRequest();
                                        xhr.onreadystatechange = function() 
                                         {
                                                            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) 
                                                                {
                                                                     document.getElementById('exp').innerHTML= xhr.responseText;
                                                                     afficherFenetre('exp');
                                                                }
                                        //etc...
                                        


                                        Et dans control.php pareil que tout à l'heure.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                          15 septembre 2010 à 21:06:28

                                          newToken();
                                          if (finaltime == 0) { // si je cogne
                                          finaltime = calctime();
                                          window.alert('Score : ' + finaltime + ' seconde(s)');
                                              var xhr=null;
                                          
                                          if (window.XMLHttpRequest) { 
                                              xhr = new XMLHttpRequest();
                                          }
                                          else if (window.ActiveXObject) {
                                              xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                          }
                                          xhr.onreadystatechange = function() 
                                           {
                                                              if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) 
                                                                  {
                                                                       document.getElementById('exp').innerHTML= xhr.responseText;
                                                                       afficherFenetre('exp');
                                                                  }
                                          //etc...
                                          


                                          C'est pendant le etc que tu dois envoyer la variable TOKEN.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            15 septembre 2010 à 21:29:40

                                            Pendant le //etc j'ai mis ça :
                                            xhr.onreadystatechange = function() {
                                                if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                                    newToken();
                                                }
                                            };
                                            
                                            xhr.open("GET", "control.php", false);
                                                xhr.send(TOKEN);
                                            var xhr = getXMLHttpRequest();
                                            


                                            Et là le jeu ne démarre plus.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                              15 septembre 2010 à 21:43:21

                                              On dirait que tu sais pas ce que tu fais. Tu te contente de copier bêtement les morceaux de code que je te donne, sans même savoir ce que ça fait. Revois ton cours, parce que là tu fais n'importe quoi :/
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                15 septembre 2010 à 21:45:44

                                                Bah c'est pas revoir c'est apprendre, je n'ai jamais touché à ça, je m'occupe du PHP et je n'ai jamais réussi à régler ce problème pour la triche.
                                                Il manque quoi pour que ce soit bon là ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                                  15 septembre 2010 à 21:49:15

                                                  J'ai jamais touché non plus, t'sais. Pourtant, j'm'y suis mis un jour, en m'aidant des tutos et de la doc'.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    15 septembre 2010 à 21:52:50

                                                    Bon j'ai ça pendant le etc.. :

                                                    xhr.onreadystatechange = function() {
                                                            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                                                TOKEN = xhr.responseText;
                                                            }
                                                        };
                                                        
                                                        xhr.open("GET", "control.php", false);
                                                        xhr.send(TOKEN);
                                                    else if(xhr.readyState < 4)
                                                                {
                                                                                  /*Ce que tu fais pendant la realisation du script (par exemple afficher                        une image de chargement) */
                                                                }
                                                    


                                                    C'est le else if qui bloque le démarrage du jeu non ? À mon avis le bout de code n'est pas bien placé.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                                      15 septembre 2010 à 21:56:44

                                                      Ouais, donc tu comprends pas le truc... Va au moins lire ce tuto, ça marchera mieux après, tu pourras au moins comprendre ce que tu essayes de faire.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        15 septembre 2010 à 22:06:45

                                                        J'ai lu et je ne comprends rien, je ne sais pas quelle partie lire et j'ai fait comme tu m'as dit sur ce topic et ça ne marche pas.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                                          15 septembre 2010 à 22:20:43

                                                          Tu peux pas lire ce tuto en 10 minutes -.-
                                                          Bon, je quitte ce sujet j'en ai marre. T'as tout ce qu'il te faut dedans, lis bien et tu pourras faire c'que tu souhaites.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            15 septembre 2010 à 22:29:28

                                                            Ouais je crois que je viens de comprendre c'était un autre truc qui bloquait, ça n'avait rien à voir avec ça.
                                                            Je vais me débrouiller, merci. ;)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Jeu du carré rouge modifié, quel niveau atteindrez-vous ? http://squared.go.yj.fr

                                                            Mettre du php dans une condition javascript

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown