(python)PyMySQL模块的使用与SQL注入

    首先简单的说一下PyMySQL模块是干什么用的。它是某个大神为给我们这些python开发人员用Python语言编写的一个MySQL驱动程序,让我们可以用Python操作MySQL数据库。如果你不想用它,你自己也可以开发一个,但是别人都写好了,你自己写一个,也没什么价值,就是浪费时间。

    so,大树底下好乘凉,我们只要把大神写好的模块拿过来用就好了,那么怎么用呢。让我来为你作一个简单的介绍。

首先安装PyMySQL模块,这个非常简单在cmd控制台上输下面的一行代码就可以了。

pip3 install pymysql

接着我是用navaicat创建一个库,然后在里创建了一个表:


import pymysql
conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db5',
    charset='utf8'
)
cursor=conn.cursor()
rows=cursor.execute('select * from class;')
print(rows)
print(cursor.fetchone())
print(cursor.fetchmany(2))
cursor.close()
conn.close()

执行结果:


来分析一下上面的代码:

pymysql.connect()

它是一个与MySQL库建立连接的方法。它里面涉及到以下的参数:

host---->MySQL服务器ip地址,自己的机子上可用’127.0.0.1‘。
port---->MySQL服务器端口号
user---->用户名
password---->自己在MySQL上设置的密码。
database---->自己已经建好的数据库名称,不然会BUG。
charset---->连接编码。

conn.cursor()

它就是创建一个游标来执行查询,

扫描二维码关注公众号,回复: 732160 查看本文章
execete()

它里面是执行的SQL语句,执行它会返回得到的一个结果的条目数,但不是具体的内容。

 因为我class表里面有4条记录,所以它就得到4条记录数,那么如何获得记录内容呢!

用三个方法:

fetchone()--->就是获取一个录取的内容。

fetchmany()--->就是可以自己定义获取多条记录的内容

fetchall()--->就是获取全部的记录内容。

如果游标已经在表文件的最末尾就不会获取到记录。


还可以用scroll()方法来相对的获得记录:



如果我们想改变一下获得记录的一个输出格式,比如字典型式,不是上面的元组。可以这样子做:


下面我们来对这个class表进行增加记录的操作:


我们看到结果为1,看来是增加一个记录可以了。但是我们再去navicat上面看的时候,发表里没有增加这行记录。


这是怎么回事,就是虽然上面执行成功了,是它还没有向数据库提交具体的记录内容。那怎么提交呢?,用commit()方法就行了。


此时就没什么问题了!去navicat看一眼:


ok这样子就可以了。

删除和修改的操作就不说了,只要SQL语名写对了,就没什么问题了。

SQL注入的问题

我们先建一张用户表


我们来模拟一下平常在某些平台上的的登录情节:

import pymysql

conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db4',
    charset='utf8'
)
cursor=conn.cursor(pymysql.cursors.DictCursor)

inp_name=input('用户名:').strip()
inp_pwd=input('密  码:').strip()
sql="select * from user where username='%s' and password='%s'" %(inp_name,inp_pwd)
print(sql)

rows=cursor.execute(sql)
if rows:
    print('登录成功')
else:
    print('登录失败')

cursor.close()
conn.close()
 
 

没问题,对不对,但是如果这样子呢!!!!!!!!!!!!!!!!!!!

输入一下对的用户名就登录成功了,也够强的了,还有更强的呢!!!

以上的情节就是SQL注入的场景,是不是很可怕!!!可怕到你都不敢用PyMySQL模块了。

少年不要慌张,你可别小看了模块,它已经解给出了解决方案了只是你不知道而已,怎么解决呢!让我来告诉你。

就是:不要自己拼接字符串,让PyMySQL模块去拼接。

import pymysql

conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db4',
    charset='utf8'
)
cursor=conn.cursor(pymysql.cursors.DictCursor)

inp_user=input('用户名:').strip()
inp_pwd=input('密  码:').strip()
sql="select * from user where username=%s and password=%s"
print(sql)

rows=cursor.execute(sql,(inp_user,inp_pwd))
if rows:
    print('登录成功')
else:
    print('登录失败')

cursor.close()
conn.close()

现在了解了这么多的知识,可以放心愉块的用PyMySQL模块了!!!加油少年。





猜你喜欢

转载自blog.csdn.net/miaoqinian/article/details/80283144