首頁 >web前端 >js教程 >如何停止透​​過響應操縱來防止 OTP 繞過

如何停止透​​過響應操縱來防止 OTP 繞過

Linda Hamilton
Linda Hamilton原創
2025-01-22 22:45:14803瀏覽

這篇部落格文章解釋如何有效防止 OTP(一次性密碼)繞過攻擊,並專注於 Node.js 和 React.js,但也適用於其他技術。 它詳細介紹了保護 OTP 實施的技術和最佳實踐。

了解 OTP 繞過攻擊

OTP 繞過利用應用程式漏洞在沒有有效 OTP 的情況下獲得未經授權的存取。 攻擊者可能會使用無效或過期的 OTP,或操縱 API 回應(通常使用 Burp Suite 等工具)來規避 OTP 驗證。 常見的攻擊包括攔截合法用戶的有效回應並將其重新用於未經授權的存取。

防止反應操縱

僅僅加密 API 回應是不夠的。雖然加密(使用 AES 或 RSA)可以保護傳輸中的數據,但所有使用者的相同回應會產生漏洞。 即使使用加密,如果成功/失敗標準僅基於 HTTP 狀態代碼或一致的成功訊息(“OTP 驗證成功”),攻擊者仍然可以透過重播捕獲的成功回應來繞過 OTP 驗證。

強大的解決方案:唯一的回應 ID

此解決方案涉及為每個請求產生唯一的每個使用者識別碼。這可以防止響應重播攻擊。 概述的方法避免使用資料庫:

客戶端實作(React.js 範例):

  1. 加密有效負載:在將 OTP 資料傳送到伺服器之前對其進行加密。
  2. 產生唯一 ID: 建立唯一的 7 字元 ID(UID,rsid)。 您可以使用任何合適的隨機 ID 產生方法。
  3. 在標頭中傳送 UID: 在請求標頭中包含 rsid
  4. API呼叫:將加密資料和rsid傳送到伺服器。
  5. 回應驗證:解密伺服器的回應。
  6. UID 匹配: 至關重要的是,將回應中收到的 rsid 與請求標頭中發送的
  7. 進行比較。 匹配表示驗證成功;不匹配表示有攻擊企圖。
<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>

伺服器端實作(Node.js 範例):

  1. 請求驗證: 驗證請求正文(加密資料)以及 rsid 標頭是否存在。
  2. 解密:解密請求正文。
  3. OTP 驗證: 根據使用者資訊驗證 OTP(使用資料庫或其他安全儲存)。
  4. 回應產生: 如果驗證成功,則加密回應並包含請求標頭中的原始 rsid
  5. 回應發送:發送加密的回應。
<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>

展示的有效性: 這篇部落格文章包含顯示成功登入和使用 Burp Suite 攔截和修改回應的失敗嘗試的螢幕截圖。獨特的rsid可以防止成功的重播攻擊。

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

影像保持在原來的位置。 請注意,圖像 URL 會被保留。 為了正確顯示它們,系統需要能夠存取這些 URL。

以上是如何停止透​​過響應操縱來防止 OTP 繞過的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn