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")
问题解答
为什么DevTools里能看到明文?
DevTools显示的是浏览器解密后的原始请求Payload——如果你的网站用了HTTPS,数据在网络传输过程中是全程加密的,第三方无法窃听;只有浏览器会解密后给开发者看原始内容,方便调试。如果是HTTP协议,数据才会明文在网络上传输,这是真正的安全风险。知名公司的情况为什么一样?
这些公司的登录页面都是基于HTTPS的,你在DevTools里看到的明文是浏览器解密后的内容,实际传输时整个请求被SSL/TLS加密了,不存在泄露风险。你需要做的事
- 强制启用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默认会自动哈希存储用户密码,数据库里不会存明文)。前端加密后反而会导致后端无法正常验证。
- 强制启用HTTPS:生产环境必须配置SSL证书,让所有请求走HTTPS,这是防止密码在传输过程中被窃听的核心手段。Django可以通过设置
内容的提问来源于stack exchange,提问作者Hemal Patel
相关产品推荐
相关产品推荐

