web-dev-qa-db-fra.com

Protéger l'API d'être altéré?

Je construis une API avec des sites Web qui sertialise les données via JSON. L'application elle-même est une application de discussion. Je suis proposé la structure suivante pour envoyer mes données:

{date: '2020-05-31', time: '14:28:05', text: "Hey!", to: '<id:int>', from: '<id:int>'}

L'utilisateur envoie fondamentalement un message via le navigateur et il est reçu dans un serveur WebSocket. Le à partir de: 'ID' Serait de l'utilisateur qui envoie les données alors que le à: 'ID' serait à l'utilisateur que les données sont envoyées.

En regardant cela, j'ai un très mauvais sentiment. Mes pensées; L'utilisateur utilisant l'application serait en théorie authentifier et c'est là qu'il obtiendrait son identifiant. Ensuite, le récepteur aurait un autre identifiant, tel que ce n'est pas la même chose que l'authentifié (évidemment). Le serveur rechercherait ensuite cet identifiant et envoie le message mais je ne sais pas si cela est sécurisé.

Je pense que certains aspects doivent être traités correctement pour protéger l'application de tout attaquant:

  • Et si l'attaquant décide d'altérer le "à partir de: id" de telle sorte qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?
  • Et si l'attaquant construit un script qui espionne des millions de messages en tirant parti du champ "à: id"?

Est-il possible qu'il existe une autre question de sécurité que je ne suis pas concernée?

22
VladiC4T

Et si l'attaquant décide d'altérer le "de: id" de telle sorte qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

Créez une session et utilisez l'identifiant de session comme identifiant, pas l'ID utilisateur directement. Par exemple. Laissez l'utilisateur envoyer des informations d'identification et sur une validation réussie, renvoyez une poignée de session (à courte durée), qui peut être utilisée dans les messages futurs.

Validez que la session existe et est active et de retourner sur le côté serveur de l'utilisateur.

Et si l'attaquant construit un script qui espionne des millions de messages en tirant parti du champ "à: id"?

Taux Limiter les utilisateurs Server côté. Par exemple, interdit d'envoyer des messages à plus de dix utilisateurs différents par une minute. Cela ne dérangera probablement pas les utilisateurs légitimes, mais entravera les efforts des spammeurs. Le réglage de la limite peut évidemment être nécessaire - et il peut être une idée de la soulever pour les utilisateurs de confiance, basé sur le comportement et la plus abaissez-la lors de la réception de rapports sur le spam des utilisateurs.

51
vidarlo

Et si l'attaquant décide d'altérer le "de: id" de telle sorte qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

N'utilisez pas de: ID dans votre API. Vous le connaissez déjà à partir de la session authentifiée par l'utilisateur et avons une raison nulle pour l'utilisateur de vous le transmettre en premier lieu. Et s'il n'y a rien à transmettre, il n'y a rien à saboter.

Sur cette note, jetez aussi la date et l'heure. Vous savez déjà lorsque vous avez reçu un message et n'avez pas besoin d'un utilisateur de vous le dire. Vous n'avez besoin que de celles-ci si votre application + API ait un concept de messages hors ligne/planifiés/arriérés.

Et si l'attaquant construit un script qui espionne des millions de messages en tirant parti du champ "à: id"?

C'est assez vieux, même un problème classique différent, tout comme de vieilles solutions. L'un des plus simples consiste à introduire un délai d'attente: le backend se souvient lorsque l'utilisation a envoyé un message et qu'il ne peut rien envoyer tant que certaines règles sont passées. Une solution plus complexe encore complexes à ébullition pour limiter l'utilisateur à une certaine quantité de messages par période, mais utilisez des retards progressivement plus importants qui tombent dans le temps car plus de messages sont envoyés. Recherchez "Limite" ou "limite de taux" pour certains Exemples et idées.

12
Oleg V. Volkov

Règle 0: Ne faites jamais confiance au client. Validez toutes les entrées du côté du client dans toutes les circonstances.

Dans ce cas, cela signifie vérifier que l'utilisateur d'envoi est (A) authentifié comme qui, ils prétendent envoyer le message, et (b) sont autorisés à envoyer un message donné, en fonction de vos critères. Cela signifie également que le champ "Texte" doit être désinfecté avant d'être stocké ou affiché à n'importe qui et que l'horodatage pour l'envoi de temps devrait être défini par le serveur - en ce qui concerne votre système, un message n'a été que "envoyé" lorsque Le système l'a reçu de l'expéditeur.

Après avoir découragé les parties du modèle éteint que le serveur peut (et devrait) remplir pour l'utilisateur, ce que vous avez, c'est simplement l'ID de destinataire et le contenu du message.

En ce qui concerne l'énumération de la liste d'utilisateurs en utilisant des identifiants et/ou des spamming séquentiels, il existe de multiples façons de gérer cela, tels qu'une "demande d'ami" (par courrier électronique, téléphone, nom d'utilisateur, etc.) qui limite les utilisateurs à être Capable d'envoyer des messages aux destinataires pré-autorisés et ne donne aucune indication de si la cible d'une demande d'ami est un utilisateur réel du système. De plus, vous pouvez faire de la limitation des taux traditionnels avec quelque chose comme un seau qui fuit, ou même construire un système de surveillance qui expose les utilisateurs qui présentent des comportements d'inondation/spam.

0
Garandy