【数据库设计】login.ui界面的pymysql连接&md5存储密码的数据库实现

关于命令行mysql启动

从Windows命令行启动MySQL

SERVER

从Windows命令行启动MySQL
可以从命令行手动启动MySQL服务器。可以在任何版本的Windows中实现。

要想从命令行启动mysqld服务器,你应当启动控制台窗口(或“DOS window”)并输入命令:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld

根据系统中MySQL安装位置的不同,前面的例子中使用的路径也不同。

在非NT版本的Windows中,在后台启动mysqld。也就是,服务器启动后,你应当可以看见后面的命令提示。如果你用该方法在Windows NT、2000、XP或2003中启动服务器,服务器则在前台运行,在服务器退出前,不会出现命令提示。因此,当服务器运行时,应当打开另一个控制台窗口来运行客户端程序。

下述命令可以停止MySQL服务器:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root shutdown

该命令调用MySQL管理工具mysqladmin连接服务器并告知它关闭服务。该命令使用MySQL root用户连接,这是MySQL权限系统中的默认管理账户。请注意MySQL权限系统中的用户完全独立于Windows下的登录用户。

如果mysqld不能启动,检查错误日志看看服务器是否写入了显示问题原因的任何消息。错误日志位于C:\Program Files\MySQL\MySQL Server 5.1\data目录中。是带后缀.err的文件。还可以尝试将服务器启动为mysqld --console;此时,可以从窗口中获得一些有用的信息,可以帮助解决问题。

最后选项是用--standalone --debug启动mysqld。此时,mysqld 写入日志文件C:\mysqld.trace,应当包含mysqld不启动的原因。

使用mysqld --verbose --help显示mysqld的所有选项。

CLIENT

mysql -uroot -p密码

关于能否防范SQL注入

SQL语句字符串拼接查询

username=input()
password =input()
# 正常构造语句的情况
sql = "select user,pwd from User where user='%s' and pwd='%s'" % (username,password)

其实用户可以这样输入实现免帐号登录:
username: 'or 1 = 1--
password:
如若没有做特殊处理,那么这个非法用户直接登陆进去了.
当输入了上面的用户名和密码,服务端的sql就变成:
sql = "select user,pwd from User where user=''or 1 = 1--' and pwd='%s'"
因为条件后面user=''or 1=1。 用户名等于''或1=1那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

参数化查询

#变量输入
username= input()
password =input()
#执行参数化查询
row_count=cursor.execute("select user,pwd from User where user='%s' and pwd='%s'" ,(username,password))

execute()函数本身就有接受SQL语句变量的参数位,只要正确的使用(直白一点就是:使用”逗号”,而不是”百分号”)就可以对传入的值进行correctly转义,从而避免SQL注入的发生。

最基础的连接

定义一个函数db_connnect()
为button按钮设置一个clicked.connet(self.db_connect)

字段于表的设计

MySQL中的char和varchar

MySQL中的char和varchar

MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字 节 ,一般用作中文或者其他语言输入,这样不容易乱码;varchar: 汉字是2个字节,其他字符存为1个字节,varchar适合输入英文和数字。

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是 65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同

DVWA密码md5加密的字段设计

我们这里的字段设置参考DVWA的设计:
命令行执行

mysql #进入mysql
show databases;
use dvwa;
show tables;
desc users;

在这里插入图片描述
在这里插入图片描述
对于我们的登录,我们如此设计:
mysql自动维护create_time和update_time
为了安全性,我们将存储的密码进行md5加密,因此修改存储字段类型为varchar(32),使用32位md5统一存储。

create table stu_users(stu_user_id BIGINT not null,stu_password varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,last_login timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),PRIMARY KEY (stu_user_id))DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

create table adm_users(adm_user_id int(6) not null,adm_password varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,last_login timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),PRIMARY KEY(adm_user_id))DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在这里插入图片描述

在这里插入图片描述
我校学生学号超过了INT型的最大值
在这里插入图片描述
修改stu_user_id为BIGINT类型。

  • 原表信息如下
    在这里插入图片描述
  • md5处理密码后
    在这里插入图片描述
    在这里插入图片描述

设计槽函数链接

Python编程之self

C语言的this指针类似于python当中的self,只是python当中的self需要自己手动传进去参数。

Python NameError: name ‘self’ is not defined 解决方法

python报错: xxx takes 1 positional argument but 2 were given

MD5加密测试

import hashlib #python自带,不需要pip install
class Ui_login(object):
	def __init__(self):
		pass
	def generateMD5(self,str):
		h=hashlib.md5() #初始化一个对象
		h.update(str.encode(encoding='utf-8'))
		return h.hexdigest()

if __name__=='__main__':
	form1=Ui_login()
	string='123456_02'
	print("MD5 prototype:{}".format(string))
    print("MD5 outcome:{}".format(form.generateMD5(string)))

在这里插入图片描述
和我们在md5加密网站测试的结果是一样的
在这里插入图片描述

嵌入式sql

'''
Description: 
Author: dive668
Date: 2021-07-20 10:59:01
LastEditTime: 2021-07-20 15:41:57
'''
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'd:\coding_programs\PythonPrograms\student_status_information\login.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import hashlib
import pymysql
import Ui_stu_main_window
class Ui_login(object):
    def __init__(self):
        pass
    
    def setupUi(self, login):
        login.setObjectName("login")
        login.resize(1123, 849)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("d:\\coding_programs\\PythonPrograms\\student_status_information\\login_ui.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        login.setWindowIcon(icon)
        self.passwd_label = QtWidgets.QLabel(login)
        self.passwd_label.setGeometry(QtCore.QRect(370, 420, 121, 61))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.passwd_label.setFont(font)
        self.passwd_label.setObjectName("passwd_label")
        self.passwd_lineEdit = QtWidgets.QLineEdit(login)
        self.passwd_lineEdit.setGeometry(QtCore.QRect(490, 430, 211, 51))
        self.passwd_lineEdit.setEchoMode(QtWidgets.QLineEdit.Password)
        self.passwd_lineEdit.setObjectName("passwd_lineEdit")
        self.stu_login_Button = QtWidgets.QPushButton(login)
        self.stu_login_Button.setGeometry(QtCore.QRect(360, 510, 131, 61))
        self.stu_login_Button.setObjectName("stu_login_Button")
        self.stu_login_Button.clicked.connect(self.stu_login)
        self.admin_teach_login_Button = QtWidgets.QPushButton(login)
        self.admin_teach_login_Button.setGeometry(QtCore.QRect(570, 510, 141, 61))
        self.admin_teach_login_Button.setObjectName("admin_teach_login_Button")
        self.admin_teach_login_Button.clicked.connect(self.adm_login)
        self.user_label = QtWidgets.QLabel(login)
        self.user_label.setGeometry(QtCore.QRect(370, 330, 131, 81))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(20)
        self.user_label.setFont(font)
        self.user_label.setObjectName("user_label")
        self.user_lineEdit = QtWidgets.QLineEdit(login)
        self.user_lineEdit.setGeometry(QtCore.QRect(490, 350, 211, 51))
        self.user_lineEdit.setObjectName("user_lineEdit")
        self.software_title = QtWidgets.QLabel(login)
        self.software_title.setGeometry(QtCore.QRect(300, 150, 491, 161))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(28)
        self.software_title.setFont(font)
        self.software_title.setObjectName("software_title")

        self.retranslateUi(login)
        QtCore.QMetaObject.connectSlotsByName(login)

    def retranslateUi(self, login):
        _translate = QtCore.QCoreApplication.translate
        login.setWindowTitle(_translate("login", "学生学籍信息管理系统"))
        self.passwd_label.setText(_translate("login", "密  码:"))
        self.stu_login_Button.setText(_translate("login", "学生登录"))
        self.admin_teach_login_Button.setText(_translate("login", "教师/管理员登录"))
        self.user_label.setText(_translate("login", "用户名:"))
        self.software_title.setText(_translate("login", "学生学籍信息管理系统"))

    def generateMD5(self,str):
        h=hashlib.md5()
        h.update(str.encode(encoding='utf-8'))
        return h.hexdigest()
    
    #学生登录窗口调用
    def stu_login(self):
        self.stu_user=self.user_lineEdit.text().strip()
        stu_passwd=self.passwd_lineEdit.text().strip()
        db=pymysql.connect(host='127.0.0.1',user="student",password="student",database="student_status_information")
        cursor=db.cursor()
        hex_stu_passwd=self.generateMD5(stu_passwd)
        cursor.execute("select stu_user_id,stu_password from stu_users where stu_user_id=%s and stu_password=%s",(self.stu_user,hex_stu_passwd))
        results=cursor.fetchall()
        if results==(): #注意没有匹配到结果的返回值是()
            self.login_msg_error = QtWidgets.QMessageBox()
            self.login_msg_error.setText("账号/密码存在错误,请重新输入")
            self.login_msg_error.show()
            self.user_lineEdit.clear()
            self.passwd_lineEdit.clear()
            self.user_lineEdit.setFocus()
        else:
            MainWindow.close()
            self.stu_MainWindow = QtWidgets.QMainWindow()
            self.stu_main_window = Ui_stu_main_window.Ui_login()
            self.stu_main_window.setupUi(self.stu_MainWindow)
            self.stu_MainWindow.show()
        db.close()

	#管理登录窗口跳转
    def adm_login(self):
        self.adm_user=self.user_lineEdit.text().strip()
        adm_passwd=self.passwd_lineEdit.text().strip()
        db=pymysql.connect(host="127.0.0.1",user="root",password="123456",database="student_status_information")
        cursor=db.cursor()
        hex_adm_passwd=self.generateMD5(adm_passwd)
        cursor.execute("select adm_user_id,adm_password from adm_users where adm_user_id=%s,adm_password=%s",(self.adm_user,hex_adm_passwd))
        results=cursor.fetchall()
        if results==():
            self.login_msg_error=QtWidgets.QMessageBox()
            self.login_msg_error.setText("账号/密码存在错误,请重新输入")
            self.login_msg_error.show()
            self.user_lineEdit.clear()
            self.passwd_lineEdit.clear()
            self.user_lineEdit.setFocus()
        else:
            MainWindow.close()
            self.adm_MainWindow=QtWidgets.QMainWindow()
            self.adm_main_window=Ui_stu_main_window.Ui_login()
            self.adm_main_window.setupUi(self.adm_MainWindow)
            self.adm_MainWindow.show()
        db.close()


if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    login_ui = Ui_login()
    login_ui.setupUi(MainWindow)
    login_ui.user_lineEdit.setFocus()
    MainWindow.show()
    sys.exit(app.exec_())
posted @ 2021-07-21 00:14  flybird2008  阅读(11)  评论(0)    收藏  举报  来源