首页 > 解决方案 > 我的自定义登录安全吗?

问题描述

我已经创建了自己的自定义登录,我没有使用 django 的登录。

这是我的models.py

class TipeUser(models.Model):
    tipe = models.CharField(max_length=30)
    detail = models.CharField(max_length=50, blank=True, null=True)
class User(models.Model):

    user = models.CharField(max_length=20)
    password = models.CharField(max_length=50)
    state = models.CharField(max_length=1)
    id_tipe_user = models.ForeignKey(TipeUser, on_delete=models.CASCADE)

我的意见.py

    def login(request):

        context={}  
        return render(request, 'login.html', context)

    def validate(request):
        if request.method=='POST':
            nameUser = request.POST.get('nameUser')
            passwordUser = request.POST.get('passwordUser')
            password = md5.new(passwordUser).hexdigest()
         try:
            userAdmin = User.objects.get(user=nameUser, password=password, id_tipe_user=1, state=1)
            request.session['nameUser'] = userAdmin.user
            return redirect('home')
         except User.DoesNotExist: 
             message= "User/Password wrong !!"
              context = {
                 'message': message,
              }
               return render(request, 'login.html', context)

    def home(request):

        if 'nameUser' not in request.session:

            return render(request, 'login.html', {})
        else:
           return render(request, 'myMenu.html', context)

def logout(request):

    if 'nameUser' in request.session:

        #delete session
        del request.session['nameUser']
        #redirect to login
        return redirect('login')


    else:
        return redirect('login')

我想要第二个意见,这是好的做法吗?我在这里完全安全,还是需要修改我的代码?

标签: pythondjangosecurity

解决方案


不,这不对。

  • 至少 15 年以来,对密码使用 MD5 散列并不是一种安全的做法。
  • 您不应该将模型实例放入会话中,因为它们不会“实时”,即如果数据库中的用户发生更改,会话中的对象仍将具有旧数据。
  • 您假设有一个TipeUserID 为 1 的(无论这意味着什么)。
  • 您正在state使用 integer 查询 CharField 1
  • 可能还有其他事情,但我不会费心去列举它们,因为——</li>

坦率地说,您正在重新发明 Django 为会话和用户提供的完美轮子。你为什么做这个?如果您需要有关用户模型的额外数据,那么已经有支持


推荐阅读