Partage
  • Partager sur Facebook
  • Partager sur Twitter

Empêcher l'exécution d'une requête AJAX

depuis la console

Sujet résolu
    24 janvier 2023 à 14:24:20

    Bonjour,

    Je cherche à savoir comment sécuriser une requête AJAX afin d'éviter que mes requêtes AJAX soient exécutées depuis la console du navigateur.

    Pour un mini jeu, une fois que l'utilisateur a terminé sa partie, j'exécute une fonction JS qui envoie une requête vers mon serveur pour stocker le score en base de données. Seulement, depuis la console, si on exécute cette fonction, le score est ajouté (avec un score bidon ...)

    J'ai essayé de sécuriser avec un token, mais il suffit d'exécuté la fonction pour générer le token, et le stocké dans le cookie, puis exécuté la fonction et le score est tout de même ajouté.

    Voici mon code lors de la fin de la partie (strRandom() est ma fonction qui génère juste une chaine aléatoire) : 

      var token = strRandom();
      document.cookie = 'token='+token;
      addScore(currentScore, token);


    Voici ma fonction addScore() :

    function addScore(currentScore,token){
        $.ajax({
            type: 'post',
            url: 'assets/php/add-score.php',
            data: {
              currentScore:currentScore,
              token:token,
            },
            success: function (response) {
                console.log(response);
            }
        });
    }

    Donc ma fonction envoie le score et le token sur mon script add-score.php, qui lui fait la requête SQL.

    Sur mon script PHP je commence par récupéré les valeurs envoyées ainsi que mon token stocké dans le cookie : 

    $score = strip_tags($_POST['currentScore']);
    $token_app = strip_tags($_POST['token']);
    $token_cook = $_COOKIE['token'];

    Ensuite je fais une comparaison entre $token_app (passé dans la fonction AJAX) et $token_cook qui est le cookie.

    Mais mon problème est que si depuis la console du navigateur on fait :

    strRandom(); pour généré un token.

    document.cookie = 'token=cwksdphnyxxopolnnksamhjid'; pour créer le cookie.

    addScore(10, 'cwksdphnyxxopolnnksamhjid'); pour ajouter le score… et cela fonctionne.

    Existe il une façon de sécurisé tout ça ?

    Merci

    -
    Edité par Boosterz 24 janvier 2023 à 14:25:01

    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2023 à 21:02:41

      Bonjour, en principe tu ne peux pas sécuriser le code javascript même si tu peux le rendre difficilement accessible,

      par exemple tu peux mettre tous ton code Javascript dans une IIFE l'utilisateur n'aura pas accès au code depuis la console car il n'est plus dans le global scope.

      Par contre il peut toujours tricher par exemple en copiant le code de ta fonction et la ré injecter dans la console pour générer le token puis manuellement envoyer la requête.

      Ducoup ça ne sécurise pas mais sa obstrue un peut le processus pour tricher.

      En principe pour sécuriser le score du joueur, il faudrait que le serveur valide l'action qui permet d'augmenter le score, donc la façon de faire dépend du jeu.

      Actuellement même si l'utilisateur ne pouvait pas manuellement envoyer la requête au serveur pour s'enregistrer un score bidon,

      il pourrait surement bricoler sont currentScore soit en modifiant le document avec un click droit -> inspecter élément, si le currentScore et lu dans le document soit en le modifiant dans la console si il est gérer par Javascript.

      La sécurisation ne devrait pas se faire à la fin de la partie mais tout le long du processus qui permet au joueurs d'obtenir quelque chose (comme des points pour son score) avec une validation du serveur.

      -
      Edité par SamuelGaborieau3 24 janvier 2023 à 21:03:07

      • Partager sur Facebook
      • Partager sur Twitter

      suggestion de présentation.

        25 janvier 2023 à 9:50:45

        Je m'y connais pas assez en javascript, mais sur stackoverflow, il y a un exemple possible me semble-t-il qui permettrait de kill la requête AJAX.

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          25 janvier 2023 à 10:11:14

          Bonjour, sur le sujet de stackoverflow la personne demande comment annuler une requête AJAX

          Ce qu'on peut faire avec un AbortController

          AbortController - Web APIs | MDN (mozilla.org)

          C'est utile dans certain cas, mais ça ne règle pas son problème.

          Si l'utilisateur envoi manuellement la requête depuis la console, il ne pourra pas l'annuler.

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            26 janvier 2023 à 15:15:04

            Bonjour,

            Merci à vous pour vos réponses :)

            Envoyer une requête à chaque augmentation de score me semblait compliqué.

            J'ai trouvé " une solution de contournement " je ne sais pas si elle est viable, mais je la partage si quelqu'un rencontre le problème, on ne sait jamais ça peut aider.

            Je génère maintenant mon token avec un script PHP qui contient uniquement la date et l'heure.

            $SESSION_ID = $_COOKIE['PHPSESSID'];
            $today = date("Y-m-d H:i:s");   
            $token = openssl_encrypt($today, 'AES-256-CTR', $SESSION_ID);
            echo $token;

            Sur mon script JS lorsque l'utilisateur termine sa partie, je génére un token (avec une latence, sinon je n'avais pas encore le résultat)

              setTimeout(function(){
                getToken();
              }, 250); 

            Ma fonction getToken() est seulement un appel de mon script PHP et met le résultat dans ma variable token.

            function getToken() {
              $.ajax({
                    type: 'post',
                    url: 'assets/php/get-token.php',
                    success: function (response) {
                      token = response;
                      
                    }
                });
            }


            Je stock ensuite le token dans le cookie et le passe en paramètre de ma fonction addScore (qui est toujours la même)

            document.cookie = 'token='+token;
              addScore(currentScore, token);

            Puis sur mon script add-score.php je compare juste la date actuel, avec le token déchiffrer afin de voir s'il est " trop " vieux 

            $token_cook = $_COOKIE['token'];
            $SESSION_ID = $_COOKIE['PHPSESSID'];
            $heure_token = openssl_decrypt($token_cook, "AES-256-CTR", $SESSION_ID);
            $timestamp_token = strtotime($heure_token);
            $timestamp_actuel = time();
            $diff = $timestamp_actuel - $timestamp_token;
            if ($diff > 25) {
                echo 'Token expiré depuis : '.$diff;
                setcookie('token', null, 0, '/');
                unset($_COOKIE['token']);
                exit;
            }


            Je me doute que c'est du bricolage, mais ca fonctionne correctement :ange:

            J'ai également rendu obligatoire la connexion pour apparaitre dans le classement, et bannis la personne qui m'embêtait :colere: 

            Encore merci à vous de votre aide 

            • Partager sur Facebook
            • Partager sur Twitter

            Empêcher l'exécution d'une requête AJAX

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown