web-dev-qa-db-fra.com

Les données importantes peuvent être modifiées à partir de la console du développeur. Que devrais-je faire?

Scénario: J'ai une liste de tâches qui est générée avec JavaScript en utilisant JSON qui a été encodé côté serveur. J'ai mis l'id de l'élément todo dans l'attribut id HTML. Donc, le processus se déroule comme suit:

  1. Le code côté serveur crée un tableau de tâches.
  2. Sérialiser le tableau en JSON
  3. Parcourez un tableau d'objets JSON et rendez la liste de tâches.

Maintenant, je dois modifier un certain élément à faire et le mettre à jour. C'est fait comme ceci:

  1. Je filtre mon tableau d'objets JSON par id en comparant l'id de la tâche qui provenait de la valeur d'attribut HTML id pour obtenir l'objet.
  2. J'utilise AJAX pour passer l'objet au INSERT.PHP page.
  3. Dans le INSERT.PHP page Je désérialise le JSON pour pouvoir le mettre à jour dans la base de données.

Problème: La mise en place de l'identifiant de la tâche dans l'attribut HTML id entraînera une faille dans le système, car l'utilisateur aura la possibilité de modifier l'ID de la tâche en utilisant la console de développement des navigateurs.

Question: Existe-t-il un moyen sûr de le faire? Suis-je en train de mal faire ou est-ce une chose normale à faire?

30
user3079341

La plupart des détails de votre question ne sont pas pertinents. Que l'ID est stocké dans un attribut d'ID HTML, les outils de développement, que vous utilisez jQuery ... Rien de tout cela n'a vraiment d'importance.

La seule chose qui compte, c'est que vous avez un point de terminaison sur votre serveur appelé insert.php. Un attaquant peut envoyer n'importe quelle demande qu'il souhaite à ce point de terminaison, quel que soit le code de votre client. Les protections contre les personnes qui essaient de faire des choses qu'elles ne sont pas autorisées à faire doivent être au niveau du serveur et non du client.

Regardez donc votre code PHP. Vérifie-t-il que l'entrée est au format attendu? Vérifie-t-il que l'utilisateur a le droit de modifier la liste de tâches particulière? Sinon, corrigez-la. Et n'oubliez pas que vos vérifications de validation et d'autorisation doivent être effectuées sur le serveur pour avoir une valeur de sécurité.

Plus précisément, si les utilisateurs doivent uniquement être autorisés à modifier les todos dont ils sont propriétaires, vous devez procéder comme suit dans insert.php:

  • Recherchez la base de données pour obtenir le propriétaire de la tâche à modifier.
  • Obtenez l'ID de l'utilisateur qui fait la demande.
  • Vérifiez qu'ils sont identiques et refusez s'ils ne le sont pas.
160
Anders

Le AJAX trucs liés que vous avez décrit n'a pas vraiment d'importance, vous ne devriez pas faire confiance au client (navigateur) et plutôt, le script insert.php devrait valider les informations.

Vous devez considérer ce que vous validez - dans le cas d'une liste de tâches, assurez-vous simplement que l'ID qu'ils ont envoyé, ils ont les autorisations appropriées pour modifier/etc. Si quelqu'un envoie manuellement des demandes à votre script insert.php, il devrait être résilient contre tout ce dont vous avez besoin (que ce soit, s'il leur appartient/ils devraient avoir la permission de le modifier/si l'élément de liste de tâches doit être est verrouillé/etc).

Vous ne devez en aucun cas faire confiance aux données que le client/navigateur vous envoie et valider tout ce qui se trouve sur le serveur. Vous pouvez également envisager alors plutôt que d'avoir un script insert.php qui semble simplement insérer un objet JSON, vous pouvez créer une API pour vos demandes AJAX plutôt que d'insérer simplement des objets JSON sans valider quoi que ce soit à ce sujet.

3
Jack