Django登录/负载在Chrome DevTools中以明文形式可见



这太奇怪了。我已经创建了登录功能很多次,但从来没有注意到这个东西。当我们在表单中提供用户名和密码并提交它时,它会像这样作为Payload到服务器端,我可以在Chrome DevTools网络选项卡中看到数据:

csrfmiddlewaretoken: 
mHjXdIDo50tfygxZualuxaCBBdKboeK2R89scsxyfUxm22iFsMHY2xKtxC9uQNni
username: testuser
password: 'dummy pass' #same as i typed(no encryption)

我得到了这个在不正确的信用的情况下,因为登录失败,它不会重定向到另一个页面。但后来我尝试了有效的信用,并在Chrome网络选项卡中检查了Preserve log框。然后我检查了那里,我仍然可以看到确切的输入Usernamepassword。一开始我以为我可能漏掉了一些加密逻辑之类的东西。但后来我尝试了多个知名科技公司的登录功能,我仍然可以在有效载荷中看到信用。这不是错的吗?

应该是加密格式,对吗?

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>

登录视图
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")

应该是加密格式,对吧?

你在Chrome DevTools中看到的是用户名和密码在他们被加密之前。

如果你在发出请求时运行tcpdump或Wireshark,你会看到它是通过网络加密的

为了让任何人都能使用数据,它必须在某个时刻未加密/解密。

例如,你也可以在Chrome DevTools中看到响应数据(状态码,报头,有效载荷),这是通过网络加密的,但它在被解密后显示给你


这是一个类似问题的类似答案。


EDIT:这都是假设你在一个使用https的网站上。如果您使用的是普通的olehttp任何嗅探网络的人都可以看到您的明文用户名+密码。

前端的一切——浏览器端对所有人都是可见的,开发工具也不例外。出于安全考虑,请使用HTTPS。

最新更新