首页 > web前端 > js教程 > 如何停止通过响应操纵来防止 OTP 绕过

如何停止通过响应操纵来防止 OTP 绕过

Linda Hamilton
发布: 2025-01-22 22:45:14
原创
801 人浏览过

这篇博文解释了如何有效防止 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板