You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止HTML与JavaScript中的验证密钥被Inspect工具查看?

解决前端验证猜码泄露的问题

你遇到的核心问题其实是前端代码和数据对用户完全透明——不管是硬编码在JS里的正确值,还是隐藏的<input>字段,用户都能通过浏览器开发者工具轻松查看。因为浏览器需要加载这些内容才能运行前端逻辑,所以前端永远藏不住敏感的验证规则或正确值。

要彻底解决这个问题,必须把验证逻辑移到后端,也就是你的Django服务端。下面是具体的实现思路和代码示例:


核心思路:后端做唯一验证

前端只负责收集用户输入并发送到后端,真正的正确性判断在后端完成,正确的代码只存储在后端(数据库、配置文件或环境变量里),前端完全接触不到。这样无论用户怎么查看前端代码,都看不到正确的验证码。

步骤1:编写Django后端验证接口

在你的Django项目里添加一个视图函数,专门处理验证码验证请求:

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import os

# 推荐把正确代码存在环境变量里,更安全(避免硬编码在代码中)
CORRECT_CODE = os.environ.get("GUESS_CODE", "your_secret_code")

@csrf_exempt
def verify_guess_code(request):
    # 只接受POST请求
    if request.method != "POST":
        return JsonResponse({"status": "error", "message": "Invalid request method"})
    
    # 获取用户输入的验证码
    user_input = request.POST.get("user_code", "").strip()
    
    # 后端验证逻辑
    if user_input == CORRECT_CODE:
        return JsonResponse({"status": "success", "message": "Code Correct"})
    else:
        return JsonResponse({"status": "error", "message": "Referral Code"})

别忘了在urls.py里添加对应的路由:

from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path("verify-code/", views.verify_guess_code, name="verify_code"),
]

步骤2:修改前端逻辑,调用后端接口

前端不再做本地判断,而是把用户输入发送到后端接口,根据返回结果显示提示:

<input type="text" id="test" placeholder="Enter your code">
<button onclick="checkCode()">Check Code</button>
<div id="err"></div>

<script>
function checkCode() {
    const userInput = document.getElementById('test').value.trim();
    const errElement = document.getElementById('err');
    
    // 先做简单的前端校验(比如非空),提升用户体验
    if (!userInput) {
        errElement.style.color = "red";
        errElement.textContent = "Please enter a code";
        return;
    }
    
    // 发送请求到后端验证
    fetch("/verify-code/", {
        method: "POST",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "X-CSRFToken": getCsrfToken() // Django需要CSRF令牌防止跨站请求伪造
        },
        body: `user_code=${encodeURIComponent(userInput)}`
    })
    .then(response => response.json())
    .then(data => {
        if (data.status === "success") {
            errElement.style.color = "green";
            errElement.textContent = data.message;
            // 这里可以添加获胜后的逻辑,比如跳转到奖励页面等
        } else {
            errElement.style.color = "red";
            errElement.textContent = data.message;
        }
    })
    .catch(error => {
        console.error("Request failed:", error);
        errElement.textContent = "Something went wrong, please try again later";
    });
}

// 辅助函数:获取Django的CSRF令牌
function getCsrfToken() {
    let token = null;
    const cookies = document.cookie.split(";");
    for (const cookie of cookies) {
        const [name, value] = cookie.trim().split("=");
        if (name === "csrftoken") {
            token = decodeURIComponent(value);
            break;
        }
    }
    return token;
}
</script>

为什么之前的方法不安全?

  • 硬编码在JS里的"code":用户只要查看页面源码或开发者工具的Sources面板,就能直接看到这个值。
  • 隐藏的<input>字段:开发者工具的Elements面板可以轻松查看所有DOM元素的属性,包括隐藏字段的value。

前端的验证只能作为用户体验优化(比如即时提示非空),永远不能作为安全性的验证手段。所有涉及正确性、权限的判断,必须放在后端。

额外安全建议

  1. 把正确的验证码存储在环境变量里(比如用python-dotenv),不要硬编码在代码中,避免代码提交到版本库时泄露。
  2. 可以给后端接口添加简单的限流,防止恶意用户暴力破解验证码。
  3. 如果需要更高级的安全,可以对用户输入的验证码进行哈希处理后再发送到后端,但其实只要验证逻辑在后端,这一步不是必须的。

内容的提问来源于stack exchange,提问作者VATSAL JAIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:43:12