数据库之(4)pymysql 模块

pymysql模块相关方法:

 1 import pymysql     # python 调用mysql的客户端
 2 #连接数据库,connections.Connection.__init__()
 3 conn = pymysql.connect(
 4     host = '127.0.0.1',
 5     port = 3306,
 6     user = 'root',
 7     password = '',
 8     database = 'day45',#数据库名
 9     charset = 'utf8',
10 )
11 cur = conn.cursor()#拿到游标
12 
13 # 增删改,写数据库
14 #方式一
15 # sql_info = 'insert into userinfo(name,password) values("%s","%s")'%('egon',123)
16 # cur.execute(sql_info)
17 
18 #方式二:
19 # sql_info = 'insert into userinfo(name,password) values(%s,%s);'
20 # ret = cur.execute(sql_info,('wu12',1234))
21 # print(ret)
22 #方式三
23 # cur.executemany(sql_info,[('egon1',123),('egon2',123)])
24 
25 #查,读数据库
26 # sql_info = 'select * from userinfo;'
27 sql_info = 'select password from userinfo where name = "alex";'
28 rows = cur.execute(sql_info)
29 print(rows)#查到的数据有几行,并非获取的数据本身
30 
31 #以元组的形式取出数据
32 print(cur.fetchall()[0][0])#一次取出一块
33 # print(cur.fetchmany(4))#一次取出多个,用户可以指定个数
34 # print(cur.fetchall())#把剩下的所有取出来
35 
36 conn.commit()#事务型的表的存储方式,必须commit
37 
38 cur.close()#关闭游标
39 
40 conn.close()#关闭连接

方法:

1 1 cur.execute()#只能传递一组参数
2 2 cur.executemany()#以列表形式传递多组参数
3 3 cur.fetchone()#获取一个查询结果
4 4 cur.fetchmany()#获取多个查询结果
5 5 cur.fetchall()#获取所有的查询结果

 cur = conn.cursor()#获取游标,等同于shell里的mysql>

2.excute()之SQL注入

 

  原理:利用某些特殊符号在SQL里具有特殊的意义

  1.利用‘--’在mysql中注释的特殊意义

 1 import pymysql
 2 
 3 
 4 name = input('name>>>').strip()
 5 password = input('password>>>').strip()
 6 conn = pymysql.connect(
 7     host = '127.0.0.1',
 8     port = 3306,
 9     user = 'root',
10     password = '',
11     database = 'day45',
12     charset = 'utf8',
13 )
14 
15 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示
16 cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#执行结果默认以字典的形式显示
17 
18 ####sql注入漏洞
19 # 漏洞一:alex" -- aaa
20 # 漏洞二:aaa " or 1=1 -- aaa
21 sql = 'select * from userinfo where name = "%s" password = "%s" ;'%(name,password)
22 print(sql)
23 ret = cur.execute(sql)
24 
25 conn.commit()
26 cur.close()
27 conn.close()
28 
29 if ret:
30     print('登录成功')
31 else:
32     print('登录失败')

 

# 漏洞一:alex" -- aaa

执行结果:

# 漏洞二:aaa " or 1=1 -- aaa

执行结果:

 解决手段:

  1.前端限制:要求用户不能够输入具有特殊意义的符号

  2.后台:有的数据不是通过前端传递过来,需要程序员控制,即是通过正则表达式等手段,提取出具有特殊符号的内容,让该SQL语句不要执行。

 3.查询语句

绝对位移执行结果

 1 import pymysql
 2 
 3 
 4 conn = pymysql.connect(
 5     host = '127.0.0.1',
 6     port = 3306,
 7     user = 'root',
 8     password = '',
 9     database = 'day45',
10     charset = 'utf8',
11 )
12 
13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示
14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
15 
16 ####查询:
17 sql = 'select * from userinfo'
18 cur.execute(sql)
19 
20 print(cur.fetchone())#1
21 cur.scroll(2,mode='absolute')# 相对绝对位置移动
22 print(cur.fetchone())#3
23 cur.scroll(2,mode='absolute')# 相对绝对位置移动
24 print(cur.fetchone())#3
25 
26 
27 
28 # print(cur.fetchmany())#字典在列表中
29 # print(cur.fetchall())#字典在列表中
30 
31 conn.commit()
32 cur.close()
33 conn.close()

执行结果:

相对位移执行结果:

 1 import pymysql
 2 
 3 
 4 conn = pymysql.connect(
 5     host = '127.0.0.1',
 6     port = 3306,
 7     user = 'root',
 8     password = '',
 9     database = 'day45',
10     charset = 'utf8',
11 )
12 
13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示
14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
15 
16 ####查询:
17 sql = 'select * from userinfo'
18 cur.execute(sql)
19 
20 print(cur.fetchone())#1
21 # cur.scroll移动游标位置
22 cur.scroll(2,mode='relative')# 相对当前位置移动
23 print(cur.fetchone())#4
24 cur.scroll(2,mode='relative')# 相对当前位置移动
25 print(cur.fetchone())#7
26 
27 
28 
29 # print(cur.fetchmany())#字典在列表中
30 # print(cur.fetchall())#字典在列表中
31 
32 
33 # cur.execute('insert into userinfo(name,password) values ("alex2","3714")')
34 # print(cur.lastrowid)#必须要在插入一条语句后,才能够查看自增id增加到什么位置
35 
36 conn.commit()
37 cur.close()
38 conn.close()

执行结果:

4.获取插入数据的最后一条的自增id

  #cur.lastrowid 必须在插入语句后,执行

 1 import pymysql
 2 
 3 
 4 conn = pymysql.connect(
 5     host = '127.0.0.1',
 6     port = 3306,
 7     user = 'root',
 8     password = '',
 9     database = 'day45',
10     charset = 'utf8',
11 )
12 
13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示
14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
15 
16 
17 cur.execute('insert into userinfo(name,password) values ("alex3","3714")')
18 #必须在插入语句后,执行
19 print(cur.lastrowid)#必须要在插入一条语句后,才能够查看自增id增加到什么位置
20 
21 conn.commit()
22 cur.close()
23 conn.close()

 

posted @ 2017-10-29 17:44  wallisyan  阅读(50)  评论(0)    收藏  举报