Maison > interface Web > js tutoriel > Comment arrêter d'empêcher le contournement d'OTP via la manipulation de la réponse

Comment arrêter d'empêcher le contournement d'OTP via la manipulation de la réponse

Linda Hamilton
Libérer: 2025-01-22 22:45:14
original
801 Les gens l'ont consulté

Cet article de blog explique comment prévenir efficacement les attaques de contournement d'OTP (One-Time Password), en se concentrant sur Node.js et React.js, mais applicable à d'autres technologies. Il détaille les techniques et les bonnes pratiques pour sécuriser la mise en œuvre de votre OTP.

Comprendre les attaques de contournement OTP

Le contournement OTP exploite les vulnérabilités des applications pour obtenir un accès non autorisé sans OTP valide. Les attaquants peuvent utiliser des OTP invalides ou expirés, ou manipuler les réponses de l'API (souvent à l'aide d'outils tels que Burp Suite) pour contourner la vérification OTP. Une attaque courante consiste à intercepter une réponse valide d'un utilisateur légitime et à la réutiliser pour un accès non autorisé.

Prévenir la manipulation des réponses

Le simple chiffrement des réponses de l'API n'est pas suffisant. Alors que le chiffrement (à l'aide d'AES ou RSA) protège les données en transit, des réponses identiques pour tous les utilisateurs créent une vulnérabilité. Même avec le cryptage, si les critères de réussite/échec sont basés uniquement sur le code d'état HTTP ou sur un message de réussite cohérent (« OTP vérifié avec succès »), un attaquant peut toujours contourner la vérification OTP en rejouant une réponse réussie capturée.

Une solution robuste : des identifiants de réponse uniques

La solution consiste à générer un identifiant unique par utilisateur pour chaque demande. Cela empêche les attaques par réexécution de réponse. La méthode décrite évite l'utilisation de la base de données :

Implémentation côté client (exemple React.js) :

  1. Crypter la charge utile : Crypter les données OTP avant de les envoyer au serveur.
  2. Générer un identifiant unique : Créez un identifiant unique à 7 caractères (UID, rsid). Vous pouvez utiliser n'importe quelle méthode de génération d'ID aléatoire appropriée.
  3. Envoyer l'UID dans l'en-tête : Incluez le rsid dans l'en-tête de la demande.
  4. Appel API : Envoyez les données cryptées et rsid au serveur.
  5. Validation de la réponse : Décryptez la réponse du serveur.
  6. Correspondance UID : Surtout, comparez le rsid reçu dans la réponse avec celui envoyé dans l'en-tête de la demande. Une correspondance indique une vérification réussie ; une disparité signifie une tentative d'attaque.
<code class="language-javascript">const OnSubmit = async () => {
  let data = await AesEncrypt(form);
  let verifyobj = { "encdata": data };
  let getid = await makeid(7);
  let config = { headers: { "rsid": getid } };
  let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config);
  let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc);
  if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) {
    if (decryptedData.rsid === getid) {
      alert(decryptedData.message);
    } else {
      alert("Invalid User");
    }
  } else {
    alert(decryptedData.message);
  }
};</code>
Copier après la connexion
Copier après la connexion

Implémentation côté serveur (exemple Node.js) :

  1. Validation de la demande : Vérifiez le corps de la demande (données cryptées) et la présence de l'en-tête rsid.
  2. Déchiffrement : Décryptez le corps de la requête.
  3. Validation OTP : Validez l'OTP par rapport aux informations de l'utilisateur (à l'aide d'une base de données ou d'un autre stockage sécurisé).
  4. Génération de réponse : Si la validation réussit, cryptez la réponse et incluez le rsid original de l'en-tête de la demande.
  5. Envoi de la réponse :Envoyez la réponse cryptée.
<code class="language-javascript">const OnSubmit = async () => {
  let data = await AesEncrypt(form);
  let verifyobj = { "encdata": data };
  let getid = await makeid(7);
  let config = { headers: { "rsid": getid } };
  let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config);
  let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc);
  if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) {
    if (decryptedData.rsid === getid) {
      alert(decryptedData.message);
    } else {
      alert("Invalid User");
    }
  } else {
    alert(decryptedData.message);
  }
};</code>
Copier après la connexion
Copier après la connexion

Efficacité démontrée : L'article de blog comprend des captures d'écran montrant les connexions réussies et les tentatives infructueuses d'utilisation de Burp Suite pour intercepter et modifier les réponses. L'unique rsid empêche les attaques par rejeu réussies.

How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation

Les images restent dans leurs positions d'origine. Notez que les URL des images sont conservées. Pour les afficher correctement, un système doit pouvoir accéder à ces URL.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal