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 :
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
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.
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)
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.
suggestion de présentation.
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)
suggestion de présentation.