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

Django登录请求Payload在Chrome DevTools明文显示是否合理?

登录时密码明文传输的安全性疑问

我多次开发登录功能,这次用Django实现时,首次发现提交表单后在Chrome DevTools的Network标签里,Payload里的用户名和密码是明文显示的——不管登录失败(凭证错误)还是勾选Preserve log看成功登录的请求,都能看到明文。一开始以为自己漏了加密逻辑,但测试多家知名科技公司的登录功能后,发现也是同样的情况。这到底有没有问题?密码难道不该以加密格式传输吗?

相关代码

Models.py

from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

HTML表单

<form method="POST" class="needs-validation mb-4" novalidate>
    {% csrf_token %}
    <div class="form-outline mb-4">
       <input type="email" id="txt_email" class="form-control" 
          placeholder="Username or email address" required />
     </div>
  <div class="form-outline mb-4">
        <input type="password" id="txt_password" class="form-control" 
         placeholder="Password" required />
  </div>

  <div class="d-grid gap-2">
    <button class="btn btn-primary fa-lg gradient-custom-2 login_btn" type="submit" id="btn_login">
      <i class="fa fa-sign-in" aria-hidden="true"> </i> Sign in
    </button>
    <div class="alert alert-danger" id="lbl_error" role="alert" style="display: none;"></div>
  </div>

</form>

登录视图(authcheck)

def authcheck(request):
    try:
        if request.method == "POST":
            username = request.POST["username"]
            password = request.POST["password"]
            user = authenticate(username=username, password=password)
            if user is not None:
                check_is_partner = Profile.objects.filter(user__username=username, is_partner=True).values("password_reset").first()
                if check_is_partner and check_is_partner['password_reset'] is True:
                    return JsonResponse(({'code':0 ,'username':username}), content_type="json")
                if check_ip_restricted(user.profile.ip_restriction, request):
                    return HttpResponse("ok_ipr", content_type="json")
                login(request, user)
                session = request.session
                session["username"] = username
                session["userid"] = user.id
                session.save()
                if check_is_partner:
                    return HttpResponse("1", content_type="json")
                else:
                    return HttpResponse("ok", content_type="json")
            else:
                return HttpResponse("nok", content_type="json")
    except Exception:
        return HttpResponse("error", content_type="json")

问题解答

  1. 为什么DevTools里能看到明文?
    DevTools显示的是浏览器解密后的原始请求Payload——如果你的网站用了HTTPS,数据在网络传输过程中是全程加密的,第三方无法窃听;只有浏览器会解密后给开发者看原始内容,方便调试。如果是HTTP协议,数据才会明文在网络上传输,这是真正的安全风险。

  2. 知名公司的情况为什么一样?
    这些公司的登录页面都是基于HTTPS的,你在DevTools里看到的明文是浏览器解密后的内容,实际传输时整个请求被SSL/TLS加密了,不存在泄露风险。

  3. 你需要做的事

    • 强制启用HTTPS:生产环境必须配置SSL证书,让所有请求走HTTPS,这是防止密码在传输过程中被窃听的核心手段。Django可以通过设置SECURE_SSL_REDIRECT = True来强制跳转HTTPS。
    • 修正表单的name属性:你的HTML表单里,输入框只设置了id,没有name属性,后端request.POST["username"]和request.POST["password"]会抛出KeyError。需要给邮箱输入框加name="username",密码框加name="password"。
    • 无需前端加密密码:Django的authenticate方法需要接收明文密码,去和数据库中存储的哈希密码做比对(Django默认会自动哈希存储用户密码,数据库里不会存明文)。前端加密后反而会导致后端无法正常验证。

内容的提问来源于stack exchange,提问作者Hemal Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:05:19