Maison >Périphériques technologiques >Industrie informatique >Comment empêcher les attaques de rediffusion sur votre site Web
Foutre contre les attaques de relecture: une approche facile à token moyen
Les attaques de rediffusion, dans lesquelles les attaquants interceptent et remandent les paquets de réseau qui ne leur appartiennent pas, sont extrêmement dangereux et causent parfois même de graves dommages. Même sur les canaux de communication chiffrés, un attaquant peut lancer de telles attaques sans accès à la clé de décryptage. Un attaquant écoute simplement sur vos lignes et comprend grossièrement les tâches effectuées par un ensemble particulier de paquets, puis en rendant ces paquets ou des demandes, peut interrompre votre communication ou causer des dégâts plus graves.
Cet article introduira une méthode de base simple et facile à utiliser pour empêcher les sites Web d'être soumis à des attaques de relecture. Il empêche également les utilisateurs de répéter de répéter de manière répétitive la dernière demande de poste pendant le mauvais moment.
C'est loin d'être une solution complète. Il a des défauts et des problèmes à résoudre, mais il vous donne une idée approximative de la façon dont les jetons et les protocoles simples peuvent améliorer la sécurité du site Web. Un exemple de code et d'implémentation sont effectués en utilisant ASP.NET et C #, mais le concept peut être déployé sur toute autre plate-forme ou langage de programmation.
Concept de jeton unique
L'idée principale de la solution fournie dans cet article est de lier chaque réponse HTTP à une chaîne de jeton qui n'est valable que pour la demande de post suivante. Voici une ventilation simple des étapes impliquées:
<input type="hidden">
de la réponse envoyée au client. De cette manière, même si un utilisateur malveillant intercepte une demande critique envoyée au serveur, la demande ne peut pas être répétée car le jeton contenu dans la demande ne sera plus valide après avoir été envoyé au serveur. Il en va de même pour les utilisateurs imprudents qui appuient à tort sur la touche F5 et renvoient la demande après avoir publié des informations sur le serveur.
Test Environment
Pour implémenter le concept d'un jeton unique, nous créerons un exemple de page avec une zone de texte simple et un bouton de soumission. Nous ajouterons également un contrôle de balise pour afficher la sortie de test.
Le code d'arrière-plan sera un extrait simple affichant le temps de soumission plus les données contenues dans la zone de texte.
Il s'agit de la sortie de la page après la demande initiale de la demande:
Après avoir soumis la page, la sortie ressemblera à ceci:
Le problème est que si vous actualisez la page, il republiera vos données et répétera la dernière demande, le serveur le gérera sans aucun problème. Imaginez maintenant si vous venez de faire une clé de 1 000 000 $ et appuyé accidentellement sur la touche F5 de votre clavier. Ou pire, certains utilisateurs malveillants interceptent votre demande, constatez qu'il s'agit d'une transaction de paiement et répétez-la pour voler vos fonds et riposter contre vous.
Solution
Pour empêcher les demandes de publication en double, nous mettons à jour la balise pour ajouter un champ caché qui stockera le jeton.
Ensuite, nous créerons une fonction qui génère un jeton aléatoire et l'intégre à la fois dans les champs cachés et la collection de session.
, nous modifierons la fonction page_load () afin que les données publiées ne soient affichées que si le jeton publié est égal au jeton stocké dans la session.
Enfin, nous remplacerons la fonction onPrerender () pour générer un nouveau jeton avant l'envoi de la sortie finale au client. C'est ce qui en fait un jeton unique, car il se met à jour chaque fois qu'une nouvelle demande est envoyée.
Maintenant, lorsque vous cliquez sur le bouton pour soumettre le formulaire, cela fonctionne de la même manière qu'auparavant. Cependant, si vous essayez de simuler une attaque de relecture en rafraîchissant la page, vous recevrez l'erreur suivante car le jeton envoyé avec le formulaire n'est plus égal au jeton stocké sur le serveur:
De cette manière, nous pouvons distinguer les soumissions de clics de bouton valides et les demandes répétées par erreur.
Améliorer le code
Bien que ce code résout le problème d'attaque de relecture de la page, il a encore des problèmes qui doivent être résolus:
En tant que passionné de programmation (OOP) axée sur des objets (OOP), j'ai cherché des opportunités pour tirer parti de la puissance de ce meilleur paradigme de programmation pour refacter et améliorer le code.
Pour résoudre le problème ci-dessus, la première chose que nous devons faire est de définir une classe qui résumera la fonction de génération de jetons. Nous nommons la classe TokeniszedPage et la dérivons de System.web.ui.page afin que nous puissions l'utiliser pour des pages à l'avenir.
Ensuite, pour rendre le code plus facile à lire et à gérer, nous encapsulons le jeton de page et le jeton de session en deux propriétés différentes ajoutées à la classe de tokenisé. Pour rendre le code facile à porter dans les pages Web, nous utiliserons la collection ViewState au lieu de cacher le champ de saisie pour stocker le jeton de page. Nous utilisons également la propriété Page.Title comme clé pour stocker le jeton dans la session. Cela améliorera notre code et résoudra partiellement le deuxième problème qui limitera l'utilisation de notre site Web à un seul onglet du navigateur. En appliquant ce changement, nous pourrons ouvrir différentes pages du site Web dans différents onglets, mais nous ne pourrons pas ouvrir plusieurs instances de la même page dans des onglets distincts, car ils partagent toujours le jeton. Ce problème sera résolu plus tard.
Ensuite, nous ajoutons une propriété booléenne en lecture seule appelée IstokenValid, qui suit des exemples d'autres propriétés de page telles que IsPostback et Isvalid. Le but de cette propriété est de s'assurer que le jeton de page est égal au jeton de session.
Enfin, nous ajoutons le remplacement de la fonction génératerandomtoken () et de l'événement onPrerender (), tout comme il le fait dans l'environnement de test.
Maintenant, afin d'utiliser le mode de jeton unique, nous avons juste besoin de créer une nouvelle page, de le dériver de la page de tokenisée et d'utiliser IstokenValid lorsqu'un jeton unique est nécessaire.
C'est beaucoup mieux.
Rendez-le meilleur
Un problème avec ce code est que si vous avez deux onglets dans votre navigateur pointant vers la même page, la publication d'un onglet invalidera les jetons de l'autre onglet car ils utilisent la même clé de jeton de session. Cela peut être résolu en ajoutant l'ID de jeton, qui garantira que chaque séquence de demande de réponse qui se produit dans un seul onglet utilise son propre ensemble de jetons uniques et n'interfère pas avec d'autres demandes sur la même page. La première chose à faire est de retourner la classe TokeniszedPage et d'ajouter la propriété TokenId. Cette propriété génère un ID aléatoire lorsqu'il est appelé dans la demande de GET initiale pour la première fois et le stocke dans la collection ViewState pour une réutilisation future.
Ensuite, nous modifierons la propriété SessionHidDentoken pour utiliser la propriété TokenId au lieu d'utiliser la propriété Page.Title.
La chose merveilleuse est que puisque nous utilisons les principes d'abstraction et d'encapsulation (merci encore pour les avantages de la POO), nous n'avons pas besoin de faire d'autres changements, et le nouveau mécanisme fonctionnera avec toutes les pages dont nous avons tiré Page à tokenisé.
Questions restantes
C'est ce qu'il s'agit du mode de jeton unique. Il reste deux questions:
avez-vous des améliorations à ajouter ou souhaitez partager leur implémentation dans d'autres plateformes et langages de programmation? Veuillez laisser un message dans la section des commentaires ci-dessous.
FAQ sur la prévention des attaques de relecture du site Web (FAQ)
L'attaque de relecture est une forme de cyberattaque dans laquelle la transmission efficace des données est répétée ou retardée de manière malveillante ou frauduleuse. Un attaquant le fait en interceptant et en retransmettant les données, ce qui peut faire partie d'une attaque masquée via le remplacement des paquets IP. Cela constitue une menace sérieuse pour la sécurité des communications et des données.
La détection des attaques de relecture peut être difficile car les données transmises sont valides et initialement envoyées par un utilisateur autorisé. Cependant, il existe des signes selon lesquels les attaques de relecture peuvent être montrées. Il s'agit notamment de noter le retard de transmission en double ou de transmission de données. De plus, la mise en œuvre de mesures de sécurité telles que les horodatages et les numéros de série peut aider à détecter les attaques de relecture.
Les conséquences d'une attaque de rediffusion peuvent être graves, selon la nature des données interceptées. Cela peut entraîner un accès non autorisé à des informations sensibles, des transactions frauduleuses et même des violations des systèmes de sécurité. Cela peut entraîner des pertes financières, des dommages de réputation et un impact juridique potentiel.
Il existe plusieurs stratégies pour empêcher les attaques de rediffusion. Il s'agit notamment de l'utilisation de protocoles de communication sécurisés (tels que SSL ou TLS), la mise en œuvre des horodatages ou des numéros de série, et l'utilisation de mots de passe uniques ou de nombres aléatoires. De plus, la surveillance et l'audit régulièrement de votre trafic réseau peuvent aider à détecter et à prévenir les attaques de relecture.
Le nombre aléatoire est un nombre aléatoire ou pseudo-aléatoire qui n'est utilisé qu'une seule fois dans une session de communication. Il empêche les attaques de lecture en s'assurant que chaque transfert de données est unique, même si les mêmes données sont envoyées plusieurs fois. Cela empêche l'attaquant de rejouer la transmission des données avec succès.
SSL (Secure Sockets Layer) et TLS (Transport Layer Security) sont des protocoles de chiffrement qui fournissent une communication sécurisée du réseau. Ils empêchent les attaques de relecture en chiffrant les données transmises et en utilisant une combinaison de nombres de séquence et d'horodatage pour assurer l'unicité de chaque transmission de données.
Les horodatages peuvent jouer un rôle clé dans la prévention des attaques de relecture. En ajoutant un horodatage à chaque transfert de données, vous pouvez vous assurer que chaque transfert est unique et ne peut pas être joué avec succès. Si une transmission de lecture est détectée, elle peut être facilement identifiée et jetée en fonction de l'horodatage.
Oui, les attaques de relecture peuvent être menées sur n'importe quel site Web sans mesures de sécurité appropriées. Cependant, les sites Web qui transmettent des informations sensibles, telles que les données financières ou les informations personnelles, sont particulièrement vulnérables aux attaques.
Bien que cela ne soit pas aussi courant que certains autres types de cyberattaques, les attaques de relecture se produisent et peuvent avoir de graves conséquences. Par conséquent, il est très important de prendre des mesures pour les empêcher.
Certaines meilleures pratiques pour empêcher les attaques de rediffusion comprennent l'utilisation de protocoles de communication sécurisés, l'application des horodatages ou des numéros de série, en utilisant des mots de passe ou des nombres aléatoires, ainsi que une surveillance périodique et une audit de votre trafic réseau. De plus, l'éducation de vos utilisateurs sur l'importance de la sécurité et les encourager à utiliser des mots de passe sécurisés peut également aider à prévenir les attaques de relecture.
Cette sortie révisée maintient la signification d'origine tout en utilisant différentes structures de libellé et de phrases.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!