這篇部落格文章解釋如何有效防止 OTP(一次性密碼)繞過攻擊,並專注於 Node.js 和 React.js,但也適用於其他技術。 它詳細介紹了保護 OTP 實施的技術和最佳實踐。
了解 OTP 繞過攻擊
OTP 繞過利用應用程式漏洞在沒有有效 OTP 的情況下獲得未經授權的存取。 攻擊者可能會使用無效或過期的 OTP,或操縱 API 回應(通常使用 Burp Suite 等工具)來規避 OTP 驗證。 常見的攻擊包括攔截合法用戶的有效回應並將其重新用於未經授權的存取。
防止反應操縱
僅僅加密 API 回應是不夠的。雖然加密(使用 AES 或 RSA)可以保護傳輸中的數據,但所有使用者的相同回應會產生漏洞。 即使使用加密,如果成功/失敗標準僅基於 HTTP 狀態代碼或一致的成功訊息(“OTP 驗證成功”),攻擊者仍然可以透過重播捕獲的成功回應來繞過 OTP 驗證。
強大的解決方案:唯一的回應 ID
此解決方案涉及為每個請求產生唯一的每個使用者識別碼。這可以防止響應重播攻擊。 概述的方法避免使用資料庫:
客戶端實作(React.js 範例):
rsid
)。 您可以使用任何合適的隨機 ID 產生方法。 rsid
。 rsid
傳送到伺服器。 rsid
與請求標頭中發送的 <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 範例):
rsid
標頭是否存在。 rsid
。 <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
可以防止成功的重播攻擊。
影像保持在原來的位置。 請注意,圖像 URL 會被保留。 為了正確顯示它們,系統需要能夠存取這些 URL。
以上是如何停止透過響應操縱來防止 OTP 繞過的詳細內容。更多資訊請關注PHP中文網其他相關文章!