【数据库设计】login.ui界面的pymysql连接&md5存储密码的数据库实现
【数据库设计】login.ui界面的pymysql连接实现
关于命令行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 数据库的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_())



浙公网安备 33010602011771号