数据库了解及部分掌握

发布时间 2023-07-14 17:38:17作者: 别管鱼油我了

sql注入问题

sql注入原因是由于特殊符号的组合会产生特殊的效果,实际生活中,尤其是在注册用户名时,会明显提示很多特殊符号不能使用,原因一样,设计到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。

利用一些语法的特性 书写一些特点的语句实现固定的语法
MySQL利用的是MySQL的注释语法
select * from user where name='jason' -- jhsadklsajdkla' and password=''

select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password=''

当在登录过程中用户名输入mysql中的注释语句时,也会显示登录成功,以下是会产生注入问题的代码。

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='yee',
    charset='utf8',
    autocommit=True
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('>>>:').strip()
password = input('>>>:').strip()
sql = "select * from userinfo where username='%s' and password='%s'" % (username, password)
# 不要手动拼接数据 先用%s占位 之后将需要拼接的数据直接交给execute方法即可
res = cursor.execute(sql)  # 自动识别sql里面的%s用后面元组里面的数据替换
if res:
    print("登录成功")
    print(cursor.fetchall())
else:
    print("用户名或密码错误")

 

以下是解决注入问题的代码

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='yee',
    charset='utf8',
    autocommit=True   #这里默认autocommit=False 也就是自动提交,增删改需要二次确定提交,所以当不填写这个,或者为false就需要在增删改的后面加入conn.commit()
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('username:').strip()
password = input('password:').strip()

sql = "select * from userinfo where username = %s and password = %s "     #注意这里%s不能加引号,不然会报错
print(sql)
res =cursor.execute(sql,(username,password))      #这里以元组的形式传入进行匹配,因为execute里有正则表达式,解决了这个问题
data = cursor.fetchall()
if data:
    print('登录成功')
else:
    print('用户名或密码错误')

 

pymysql的补充

关于增删改查进数据库中

只有查可以输出结果,而删改查的操作设计到数据的修改,需要二次确认,查不需要。

插入数据(连接与上述都一致,以下只写关键部分)

插入单挑数据:

#插入单条数据写法一:
sql = "insert into userinfo(username,password) values (%s,%s)"
rows = cursor.execute(sql,('qxx',456))
print(rows)
#插入单条数据写法二:
sql = "insert into userinfo(username,password) values ('qxx',456)"
rows = cursor.execute(sql)
print(rows)

插入多条数据:

#写法一:
sql = "insert into userinfo(username,password) values (%s,%s)"
rows = cursor.executemany(sql,[('qxx',456),('qxx',456)])    #将execute改为executemany
print(rows)

#写法二:
sql = "insert into userinfo(username,password) values ('qxx',456),('qxx',456)"
rows = cursor.execute(sql)
print(rows)

删除数据:

sql = 'delete from userinfo where id = 1'
rows = cursor.execute(sql)
print(rows)

修改数据:

sql = 'update userinfo set username="yyqx" where id = 2'
rows = cursor.execute(sql)
print(rows)

 

 视图

视图就是通过查询得到一张虚拟表,保存下开,下次可以直接使用,视图也是表。

使用视图的原因是:如果频繁操作一张由拼表来建立虚拟表,就可以建立视图,方便后续使用。

固定语法:

创建视图:create view 表名/视图名 as 虚拟表的查询sql语句

删除视图:drop view 视图表名

ps:在硬盘中,视图只有表结构,没有表数据文件;视图通常只是用来查询,尽量不要去修改视图中的数据。

开发过程中是否会使用视图?

不会,视图是mysql的功能,如果项目里面大量使用视图,也就意味着后期想要扩张某个功能时,这个功能恰好又需要对视图修改,意味着需要现在mysql这边将视图修改,再去应用程序中修改对应的sql语句,这就涉及到跨部门的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能。

触发器

触发器是在满足对某张表数据的增删改的情况下自动触发的功能称之为触发器。

触发器专门针对我们对某一张表数据的insert、删delete、改update的运行,这类行为一旦执行,就会触发触发器的执行,即自动运行另一段sql代码