Question:
Protéger l'API contre la falsification?
VladiC4T
2020-06-01 00:35:57 UTC
view on stackexchange narkive permalink

Je construis une API avec websocket qui sérialise les données via JSON. L'application elle-même est une application de chat. J'ai mis au point la structure suivante pour envoyer mes données:

  {date: '2020-05-31', heure: '14: 28: 05 ', texte: "Hey!", à: '<id: int>', à partir de: '<id: int>'}  

L'utilisateur envoie essentiellement un message via le navigateur et celui-ci est reçu dans un serveur websocket. Le from: 'id' proviendrait de l'utilisateur qui envoie les données, tandis que le to: 'id' serait à l'utilisateur auquel les données sont envoyées.

En regardant cela, j'ai un très mauvais pressentiment. Mes pensées; L'utilisateur utilisant l'application s'authentifierait en théorie et c'est là qu'il obtiendrait son identifiant. Ensuite, le receveur aurait un autre identifiant, tel que celui-ci ne soit pas le même que celui authentifié (évidemment). Le serveur chercherait alors cet identifiant et enverrait le message, mais je ne suis pas sûr que ce soit sécurisé.

J'ai certains aspects qui, je pense, doivent être traités correctement pour protéger l'application de tout attaquant:

  • Que faire si l'attaquant décide de falsifier le " from: id" de sorte qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?
  • Que si l'attaquant crée un script qui spams des millions de messages en tirant parti du champ "to: id" ?

Est-il possible qu'il y ait un autre problème de sécurité Je ne suis pas concerné?

Veuillez ne pas utiliser d'identifiants numériques.Surtout pas si consécutif.Vous ne devez pas créer un système dans lequel les utilisateurs peuvent simplement être énumérés.Utilisez plutôt des chaînes aléatoires.Si je suis l'utilisateur 55, qui est l'utilisateur 54?Si je suis utilisateur abfkg-4remq, alors abfkg-4remr ne sera probablement même pas un utilisateur, donc en tant qu'attaquant, je ne peux pas identifier facilement tous les ID utilisateur
@stefan ceci n'est pertinent que si l'énumération d'utilisateurs est une menace.Dans de nombreux scénarios, ce n'est pas le cas.
@vidarlo est peut-être mon imagination limitée, mais je ne vois pas de scénarios où l'énumération des utilisateurs de l'extérieur est une bonne chose.Bien sûr, en interne, vous avez une base de données avec tous les utilisateurs et cela peut être nécessaire à utiliser, mais en externe, je dirais que c'est presque toujours un défaut.
Pas de sécurité, mais utilisez le format ISO pour l'horodatage (ou l'époque).Cela vous évitera beaucoup de maux de tête plus tard.Aussi, utilisez une bonne bibliothèque complète pour manipuler cette fois (par exemple, le traitement du temps par Python natif est horrible (beurk), heureusement il y a une flèche, un pendule, un dolorean)
Pour ajouter aux commentaires précédents, une autre raison de ne pas utiliser les identifiants numériques est que les nombres dans JS sont des doubles, donc imprécis pour les grandes valeurs.
@AskarKalykov Étant donné que vous ne faites pas de maths sur les identifiants dans votre application, (je ne sais pas pourquoi vous le feriez,) cette imprécision est très peu probable dans la pratique.Vous auriez presque 2 ^ 53 ids disponibles, et ce ne sont que des entiers positifs.
@Ryan1729, vous ne ferez aucun calcul, mais vous voudrez certainement passer des identifiants, et voudriez passer des identifiants appropriés.Ce ne serait pas si génial que les clients commencent à recevoir 404 ou 403 pour des demandes légitimes simplement parce que les développeurs backend ont décidé d'utiliser des décalages pour les identificateurs et la précision de ces identifiants car les doubles sont supérieurs aux nombres entiers.
@AskarKalykov 2 ^ 53 est supérieur à 9 * quadrillions *.Vous auriez plus qu'assez d'identifiants distinctifs pour tout ce qui est raisonnable.Vous n'attribuez simplement à aucun utilisateur d'ID en dehors de la plage de sécurité entière.Je ne suis donc pas sûr de ce que vous entendez par "précision de ces identifiants car les doubles sont au-dessus des nombres entiers".Vous voulez dire que les doubles sont plus précis que nécessaire?Êtes-vous préoccupé par l'apparition de bogues résultant de doubles fractionnaires?
Si nous parlions de flotteurs à simple précision, alors bien sûr, avoir seulement environ 16 millions d'identifiants possibles rend leur attribution non séquentielle difficile, et théoriquement vous pourriez en manquer, mais ce n'est pas un problème avec les doubles en particulier.
@Ryan1729 s'il vous plaît regardez le violon suivant pour comprendre de quoi je parle: https://jsfiddle.net/4ez675uf/ Si vous allez recevoir json du backend, vous ne sauriez même pas qu'il y a eu un problème.
@AskarKalykov Comme je l'ai déjà mentionné, le moment où cela commence à se produire est après 9 quadrillions.Plus précisément à 9 007 199 254 740 992.Voir https://jsfiddle.net/koe3fsh1/ Donc, n'attribuez jamais à un utilisateur un identifiant qui n'est pas compris entre 0 et 9007199254740991, et vous pouvez faire une vérification simple côté serveur pour voir si l'id est dans cette plage et rejeterquoi que ce soit en dehors.(Assurez-vous cependant de gérer correctement les NaN.) Ensuite, vous pouvez supprimer toute partie fractionnaire et l'utiliser comme ID, car un ID utilisateur ne doit pas être une clé d'accès.
Les guillemets simples ne sont pas JSON.Ils sont acceptés par de nombreux analyseurs, mais cela ne fait pas partie de la norme.Les champs de date / heure (s'ils concernent la même entité) doivent être au format ISO8601 (aa-MM-jjThh: mm: ss.fffZ), ce qui signifie qu'il est facile de créer / analyser avec des bibliothèques standard.
Huit réponses:
vidarlo
2020-06-01 00:41:51 UTC
view on stackexchange narkive permalink

Que faire si l'attaquant décide de falsifier le "from: id" afin qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

Créez une session et utilisez le identifiant de session comme identifiant, pas directement l'ID utilisateur. Par exemple. laissez l'utilisateur envoyer les informations d'identification, et après validation réussie, renvoyez un descripteur de session (de courte durée), qui peut être utilisé dans les messages futurs.

Validez que la session existe et est active, et mappez-la au serveur utilisateur -side.

Que se passe-t-il si l'attaquant crée un script qui spams des millions de messages en tirant parti du champ "to: id"?

Limite de débit côté serveur des utilisateurs. Par exemple, interdisez l'envoi de messages à plus de dix utilisateurs différents par 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 judicieux de l'augmenter pour les utilisateurs de confiance, en fonction du comportement, et de l'abaisser lors de la réception de rapports sur le spam des utilisateurs.

Ça à l'air génial.Je pense qu'une autre stratégie en ce qui concerne la limite de qui peut envoyer des messages à qui est obliger l'utilisateur à accepter une sorte de demande d'invitation avant d'autoriser l'expéditeur à envoyer des messages, tout comme Skype (par exemple).
Sûr.Ou ayez une limite initiale de 1 à 2 messages pour les nouveaux contacts et augmentez-la à mesure que les utilisateurs se répondent.
les sockets sont une connexion constante, il n'est pas nécessaire d'identifier l'expéditeur de chaque message car seul l'expéditeur peut envoyer sur cette connexion de toute façon.Une fois que l'ID utilisateur est vérifié, il n'est pas nécessaire d'avoir un ID / descripteur secondaire.
@dandavis c'est vrai, mais avec les navigateurs mobiles, il semble que [il pourrait y avoir des problèmes avec cette approche] (https://github.com/primus/primus/issues/350).Ainsi, une certaine forme de session peut ne pas être une mauvaise idée.
L'attaquant ne fera que 100000 comptes, chacun envoyant 10 messages par minute.
@user253751 afin de limiter la création de compte par IP source / plage / emplacement / en général à un seuil raisonnable - et éventuellement ajouter un captcha dans le processus de création.Si votre modèle d'application convient à cela, vous pouvez également (ou en plus) utiliser les services de connexion partagés (Facebook) ou demander un numéro de téléphone.Pour un petit service, il n'est pas nécessaire de tout avoir dès le début, mais il peut avoir besoin de développer ses capacités défensives à mesure que sa popularité augmente.
Lukas
2020-06-01 00:52:50 UTC
view on stackexchange narkive permalink

En gros, vous devez traiter chaque entrée de l'utilisateur comme potentiellement malveillante.

Vidarlo a déjà mentionné deux problèmes de sécurité et comment ils peuvent être évités dans sa réponse.

J'ajouterais également que le contenu lui-même ("text:") pourrait contenir du code malveillant (par exemple, des extraits de code javascript). Assurez-vous que ce code n'est pas exécuté à la réception.

Et je vérifierais également si l'heure semble correcte. Selon votre application, la vérification des horodatages peut être utile, voire nécessaire.

Oh ouais le temps.Dans mon cas, cela servirait simplement pour la couche d'interface, rien de vraiment sophistiqué.Connaissez-vous des blogs / ressources sur l'exploitation du temps?Je suis intéressé car vous cherchez à connaître certains problèmes qui pourraient arriver de temps à ne pas être traités correctement.
Une chose à laquelle je pense, ce sont les délais de soumission, par exemple pour l'approvisionnement.Si un expéditeur malveillant peut modifier l'horodatage du message, il peut sembler que le message a été envoyé avant la date limite (bien que ce ne soit pas le cas).Comme je l'ai écrit, cela peut ou non être un problème pour vous.
supprimez les horodatages, vous n'avez pas besoin qu'ils occupent l'espace du message, ils peuvent être usurpés, vous savez quand ils sont envoyés de toute façon.
@dandavis ils pourraient être utiles pour l'analyse des performances de l'utilisation normale - s'il n'y a pas d'autre moyen sur le canal de communication utilisé par OP.Mais oui, il ne sert à rien de compter sur eux pour tout ce qui est crucial pour la sécurité.
Oleg V. Volkov
2020-06-01 22:57:19 UTC
view on stackexchange narkive permalink

Que faire si l'attaquant décide de falsifier le "from: id" afin qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

Ne pas utiliser from: id dans votre API. Vous le connaissez déjà à partir d'une session authentifiée par l'utilisateur et vous n'avez aucune raison pour que l'utilisateur vous le transmette en premier lieu. Et s'il n'y a rien à transmettre, il n'y a rien à falsifier.

Sur cette note, jetez aussi la date et l'heure. Vous savez déjà quand vous avez reçu un message et vous n'avez pas besoin que l'utilisateur vous le dise. Vous n'en aurez besoin que si votre application et votre API ont un concept de messages hors ligne / programmés / en attente.

Et si l'attaquant construisait un script qui spammait des millions de messages en tirant parti du " to: id "field?

C'est un problème assez ancien, même classique, qui a des solutions différentes, tout comme les anciennes. L'un des plus simples est d'introduire un timeout: le backend se souvient quand l'utilisation a envoyé un message et il ne peut rien envoyer avant qu'un certain délai ne soit écoulé. Une solution plus complexe se résume toujours à limiter l'utilisateur à un certain nombre de messages par période de temps, mais utilise des délais de plus en plus importants qui diminuent avec le temps à mesure que davantage de messages sont envoyés. Recherchez «limitation» ou «limite de débit» pour certains exemples et idées.

Je vois que cela tire parti du fait que Websocket est avec état, mais mon répartiteur de messages doit définir un identifiant d'expéditeur pour que le destinataire sache à qui appartient ce message.En supprimant l'identifiant, comment suggéreriez-vous à mon répartiteur de messages de connaître l'origine du message?
Je suppose que je devrais compter sur un gestionnaire de session pour mapper la session envoyée du client Websocket à un utilisateur dans une base de données (comme redis)?
@VladiC4T Appelez la méthode API "authenticate" avant d'envoyer des messages et utilisez cette session.Vous en avez de toute façon besoin pour comprendre si l'utilisateur est même autorisé à utiliser l'API et à qui il est autorisé à envoyer un message.
Confirmer;mon API "authenticate" vérifierait les informations d'identification, puis mapperait un identifiant d'authentification à l'utilisateur.Ensuite, pour chaque message envoyé par le client, mon serveur websocket saisirait cet identifiant d'authentification et pointerait vers l'utilisateur?
Ok compris.Je suivrais simplement la connexion client websocket précédemment établie par mon authentificateur, donc en utilisant uniquement la session websocket.
@VladiC4T À peu près ceci.
Pedro
2020-06-01 15:51:38 UTC
view on stackexchange narkive permalink

Voici une vision légèrement différente de la manière dont ces problèmes pourraient être résolus. Je suppose que l'authentification et la gestion de session sont correctement implémentées.

Que faire si l'attaquant décide de falsifier le "from: id" de sorte qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

Si vous générez un identifiant unique (long, aléatoire, très difficile à deviner, comme un identifiant de session) pour chaque "salle de chat" au moment de la création et assurez-vous que toutes les parties sont heureuses de rejoindre cette salle de discussion, vous pouvez l'utiliser à la place des identifiants d'utilisateur et contrôler les salles de discussion auxquelles chaque utilisateur peut envoyer un message, pour vous assurer que d'autres ne peuvent pas envoyer de contenu aux discussions privées de quelqu'un d'autre; Ainsi, vos messages des utilisateurs X et Y seraient envoyés à la salle de discussion A et l'application les enverrait. L'utilisateur Z n'a pas été autorisé à entrer, l'application refuse donc de transmettre le message.

Que se passe-t-il si l'attaquant crée un script qui spams des millions de messages en profitant du champ "to: id"?

Assurez-vous que les messages ne peuvent pas être adressé aux identifiants d'utilisateurs et s'efforcer de rendre les identifiants d'utilisateurs difficiles à deviner.

Barker1889
2020-06-01 19:36:17 UTC
view on stackexchange narkive permalink

Que faire si l'attaquant décide de falsifier le "from: id" afin qu'il puisse envoyer des messages arbitraires à n'importe qui de n'importe quel utilisateur?

Une autre option est de donner à chaque utilisateur un ensemble de clés publiques et privées. Ceux-ci peuvent être utilisés pour générer une signature pour chaque message qui vérifie que le contenu n'a pas été falsifié et provient de l'utilisateur spécifié.

Disons que l'utilisateur 1 veut envoyer un message à l'utilisateur 2, une simplification processus serait:

  • l'utilisateur 1 reçoit une paire de clés publique / privée. Ils (ou le serveur) exposent leur clé publique à d'autres utilisateurs.
  • l'utilisateur 1 crée le contenu du message, puis génère une signature pour celui-ci en utilisant sa propre privée key (ils gardent ce secret)
  • l'utilisateur 1 envoie le message dans un paquet qui ressemble à quelque chose comme
  {"Signature": "kA7dagf4. .. ", Contenu: {date: '2020-05-31', heure: '14: 28: 05 ', texte:" Hey! "...  
  • l'utilisateur 2 reçoit le message, puis utilise la clé publique de l'utilisateur 1 pour vérifier que le contenu du message correspond à la signature

L'essentiel est que la clé publique ne peut être utilisée pour vérifier la signature - il n'est pas possible de créer une signature sans la clé privée.

Tout acteur malveillant qui souhaite se faire passer pour l'utilisateur 1 et envoyer un message à l'utilisateur 2 ne le pourra pas, car il ne le fera pas être capable de créer une signature qui est vérifiée par la clé publique de l'utilisateur 1. Ainsi, l'utilisateur 2 verrait que la signature n'est pas valide et pourrait rejeter le message lorsqu'il le reçoit.

C'est à peu près ainsi que fonctionnent les jetons Web JSON - je suggère de lire cela pour plus d'informations - https://jwt.io/introduction/

Et si l'attaquant construisait un script qui spammait des millions de messages en profitant du champ "to: id"?

Comme mentionné dans les réponses précédentes, une combinaison de limitation de débit et de rendre les champs to: id et from: id difficiles à deviner.

Un petit problème: où la clé privée sera-t-elle stockée?S'il est stocké sur le serveur, il peut emprunter l'identité des utilisateurs.Même s'il est stocké dans le navigateur, si vous utilisez JavaScript, le serveur peut toujours y accéder.Si le serveur est fiable, l'utilisation de clés publiques semble exagérée.
J'ai peut-être supposé à tort que la messagerie était d'égal à égal.Si le serveur est fiable, les idées ci-dessus sur l'utilisation d'un identifiant de session sont le moyen le plus simple de résoudre ce problème.
Iain
2020-06-01 09:22:19 UTC
view on stackexchange narkive permalink

Il est évident que les données ne sont pas chiffrées. Vous avez déjà mentionné la falsification et souvent le cryptage et l'intégrité sont traités en même temps car le cryptage sans intégrité vous laisse toujours ouvert aux attaques

Ajoutez un MAC (code d'authentification de message) pour les données. Certains modes de cryptage comme GCM (Galois / Counter Mode) en incluent un, d'autres sont séparés, vous pouvez donc utiliser HMAC avec autre chose. Tuez 2 oiseaux avec une pierre pour ainsi dire, ou utilisez simplement 2 pierres. Cela protégera-t-il l'utilisateur contre une attaque de votre côté de l'API? Vous devez également réfléchir à ce qui se passe si vous êtes compromis.

Vous pouvez regarder d'autres types d'API et voir comment ils ont atténué les types d'attaques. Par exemple, OAuth 2 utilise un paramètre d'état et un nonce, pour des raisons différentes. Comme pour la réponse de @ vidarlo, vous pouvez utiliser un nonce en combinaison avec l'ID de session.

Les websockets sont trivialement chiffrés, tout comme https, et ont une intégrité intégrée.il n'y a pas non plus besoin d'une session car ce n'est pas un cycle req / res, c'est une connexion constante.
@dandavis Je prends note de votre point de vue mais ils sont chiffrés entre le client et le serveur, et non entre le client et le destinataire final, c'est pourquoi j'ai ajouté la partie sur "votre côté de l'API".Vous avez raison sur l'ID de session, qui ne serait nécessaire que pendant la phase de configuration de la connexion, mais [les websockets sont vulnérables au détournement via CORS] (https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html), donc leLa partie concernant le paramètre d'état d'OAuth est également pertinente, tout comme l'utilisation d'un ID de session.En tant qu'utilisateur, je veux savoir que mon message parvient correctement à l'autre extrémité, pas seulement au serveur.
Le chiffrement client à serveur est la partie importante.Le chiffrement du client au destinataire final n'est important que s'il compte réellement, et selon le cas d'utilisation, le chiffrement de bout en bout ne vaut souvent pas l'effort ou n'est pas utile.
@ConorMancone "Le chiffrement du client au destinataire final n'est important que s'il compte réellement" - travaillez-vous pour une agence de 3 lettres ou un annonceur?Sinon, votre déclaration n'a aucun sens.
@Iain Que diriez-vous d'un système de messagerie dans un CRM?Ou une suite logicielle d'entreprise?Ou un certain nombre d'applications en dehors des communications de personne à personne?Il y a toujours plus de cas d'utilisation que celui que vous avez en tête, c'est pourquoi recommander universellement à peu près n'importe quoi est une mauvaise idée.Il existe de nombreux cas où E2E ne vaut pas la peine, et plus de cas où il est contraire aux besoins de l'entreprise
@ConorMancone De la question: "L'application elle-même est une application de chat".E2E est désormais bien établi en tant que fonctionnalité * raisonnable * pour les applications de chat, peut-être même une norme - même Facebook Messenger prévoit d'y passer, si les actionnaires ne le refusent pas.Hiérarchiser les besoins de l'entreprise est une bonne chose et que ce soit une priorité élevée ou non, ou même contraire aux besoins de l'entreprise, est discutable, mais il s'agit d'un forum de sécurité.
Il existe certainement de nombreux cas où le cryptage E2E est une nécessité.Je ne dis pas cela.Encore une fois, j'ai créé des applications de chat pour les logiciels d'entreprise où vous ne voudriez certainement pas le cryptage E2E.Je peux également penser à certains cas d'utilisation dans des systèmes grand public où le cryptage E2E n'est pas ce que vous voudriez.Ce que je veux dire, c'est que, comme tout ce qui concerne la sécurité, une bonne analyse des risques et la compréhension de votre cas d'utilisation sont ici importantes.Le cryptage E2E n'est pas pertinent dans tous les cas, même s'il l'est dans de nombreux cas.
-1 parce qu'il s'agissait d'une préoccupation valable, la question posée concernait un ** utilisateur ** malveillant (Alice), et non un intermédiaire malveillant (Eve).
@Tom "la vraie question posée concernait un utilisateur malveillant" Non, ce n'est pas le cas, c'est un exemple."pour protéger l'application de tout attaquant" est ce qui est indiqué dans la question.Vous pouvez remettre ce vote maintenant ;-)
@Iain J'ai relu la question et je ne vois pas le PO s'inquiéter de MitM ou de toute autre attaque ** channel **.Je pense toujours que sa préoccupation concerne les structures de données.
@Tom Comment n'avez-vous pas vu "pour protéger l'application contre *** n'importe quel *** attaquant"?Ou * Que se passe-t-il si l'attaquant crée un script qui spams des millions de messages en profitant du champ "to: id"?Ce n'est pas le cas, la limitation du débit serait une atténuation tout à fait normale qui n'affecte pas la structure de données de l'appelant.
@Iain Je ne crois toujours pas que MitM entre dans le champ de la question, mais je vais donner à cela le bénéfice du doute.
@Tom Très magnanime de votre part, et je respecte le fait que vous tenez à votre opinion.
Tom
2020-06-02 14:45:07 UTC
view on stackexchange narkive permalink

Il y a de nombreux problèmes de sécurité dans votre approche, la plupart déjà signalés dans d'autres réponses.

Je veux répondre avec des principes généraux qui vous aideront à trouver ces problèmes par vous-même.

traiter chaque donnée fournie par l'utilisateur comme malveillante

tout ce qui vient d'un client n'est pas fiable. Il a besoin de validation d'entrée, de rognage, d'échappatoire, les neuf mètres entiers. Dans votre cas, votre application envoie probablement le JSON approprié, mais que se passe-t-il dans votre API si quelqu'un fabrique à la main un JSON et vous donne un JSON invalide, ne termine pas la chaîne ou mélange l'injection SQL?

ne saisissez jamais les données que vous avez déjà

comme indiqué dans d'autres réponses, vous connaissez déjà la date / l'heure et l'identifiant "de", alors ne les acceptez pas comme contribution. En général, n'acceptez jamais de commentaires sur quelque chose que vous pouvez obtenir d'une source plus fiable.

L'approche SWIFT

examinez chaque élément et demandez-vous "qu'est-ce qui pourrait mal tourner?". SWIFT ( ici ou plusieurs autres sources) est une manière structurée de le faire. Essentiellement, une fois que vous avez réduit votre saisie au texte et à l'ID, pensez à la manière dont quelqu'un pourrait en abuser. Pourrait-il envoyer de mauvaises données, trop peu de données, trop de données? Cette approche devrait vous conduire aux menaces décrites dans d'autres réponses, telles que l'énumération, l'inondation / le spam, etc.

considérez votre système backend

enfin, connaissez les faiblesses de votre système backend . Si vous avez une base de données SQL derrière, réfléchissez aux possibilités d'injection SQL. Pensez également aux performances et aux limites du système - un utilisateur peut-il potentiellement envoyer tellement de données qu'elles submergent vos E / S, votre traitement ou votre capacité de stockage? Peut-il bloquer l'API pour d'autres utilisateurs (quelles sont vos limites de traitement parallèle? Combien de connexions pouvez-vous gérer, etc.)

Bien que ce ne soit pas une approche complète de modélisation des menaces, je trouve qu'elle sert 90% aussi bien avec un peu d'effort complet.

"Connaissez les faiblesses de votre système backend."J'étendrais généralement cela à l'ensemble du système.Par exemple, d'autres utilisateurs peuvent être vulnérables au Cross-Site Scripting (XSS) dans l'interface.
Garandy
2020-06-02 23:15:48 UTC
view on stackexchange narkive permalink

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

Dans ce cas, cela signifie vérifier que l'utilisateur expéditeur est (a) authentifié en tant que qui il prétend envoyer le message, et (b) est autorisé pour envoyer un message donné, en fonction de vos critères. Cela signifie également que le champ «texte» doit être nettoyé avant d'être stocké ou affiché à quiconque, et que l'horodatage de l'heure d'envoi doit être défini par le serveur - en ce qui concerne votre système, un message n'était «envoyé» que lorsque le système l'a reçu de l'expéditeur.

Après avoir coupé les parties du modèle que le serveur peut (et devrait) remplir pour l'utilisateur, ce que vous avez vraiment n'est que l'identifiant du destinataire et le message

En ce qui concerne l'énumération de la liste d'utilisateurs à l'aide d'identifiants séquentiels et / ou de spam, il existe plusieurs moyens de gérer cela, comme une "demande d'ami" (par e-mail, téléphone, nom d'utilisateur, etc) qui limite les utilisateurs à ne pouvoir envoyer des messages qu'à des destinataires préautorisés et ne donne aucune indication sur le fait que la cible d'une demande d'ami est un utilisateur réel du système. De plus, vous pouvez faire une limitation de débit traditionnelle avec quelque chose comme un seau qui fuit, ou même créer un système de surveillance qui marque / interdit les utilisateurs qui présentent des comportements d'inondation / spam.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...