python - 我的自定义登录安全吗?
问题描述
我已经创建了自己的自定义登录,我没有使用 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')
我想要第二个意见,这是好的做法吗?我在这里完全安全,还是需要修改我的代码?
解决方案
不,这不对。
- 至少 15 年以来,对密码使用 MD5 散列并不是一种安全的做法。
- 您不应该将模型实例放入会话中,因为它们不会“实时”,即如果数据库中的用户发生更改,会话中的对象仍将具有旧数据。
- 您假设有一个
TipeUser
ID 为 1 的(无论这意味着什么)。 - 您正在
state
使用 integer 查询 CharField1
。 - 可能还有其他事情,但我不会费心去列举它们,因为——</li>
坦率地说,您正在重新发明 Django 为会话和用户提供的完美轮子。你为什么做这个?如果您需要有关用户模型的额外数据,那么已经有支持。
推荐阅读
- awk - 如何用引号分隔单词
- javascript - Accordion JS 超链接传播
- java - (Java) 执行硬币翻转程序的代码时出现逻辑错误
- r - R Shiny:如何在浏览器上显示循环的每次迭代?应在单击按钮时触发循环
- python - 在 colab 中使用自定义 cython 模块
- python - X 和 XT 的区别
- javascript - 坚持一个简单的递归练习,得到“最大堆栈错误”
- vba - VBA突出显示列中的重复项
- c# - 如何在 WeifenLuo 中使用预先存在的表单 LoadFromXml?
- flutter - Initstate 没有被引用 Flutter 问题