MySQL学习9:数据库模块pymysql的使用

Posted Z|Star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习9:数据库模块pymysql的使用相关的知识,希望对你有一定的参考价值。

pymysql的安装

pip install pymysql

使用Python DB API访问数据库流程

读取数据

关键词:
fetchone():读取一条数据(一条条出栈),每个数据以元组形式返回。
fetchall():读取所有数据,所有数据以元组套元组的形式返回。
fetmany(数据个数):读取指定条数据,括号内填数据个数。

查询代码示例

import pymysql

def main():
    # 创建Connection连接
    conn = pymysql.connect(host="localhost", port=3306, user="root", password="这里是自己数据库的密码", database="myfirst")
    # 获得Cursor对象
    csl = conn.cursor()
    # 执行sql语句
    count = csl.execute("select * from heros ")
    print("查询到%d数据:" % count)

    for i in range(count):
        result = csl.fetchone()
        print(result)

    csl.close()
    conn.close()


if __name__ == '__main__':
    main()

增加、删除、修改数据

sql语句不变,但增加、删除、修改后需要进行提交更新:

conn.commit()

撤回操作:

conn.rollback()

注:写sql语句时,一对双引号"“容易产生误判,最外层的双引号可以改为连续三个”"" “”"。

sql注入

原理:当我们写sql语句时,若采用字符串拼接的方式将用户的输入拼接成sql语句,这个时候就存在sql注入漏洞。
下面这段程序将说明如何进行一个简单的sql注入。

import pymysql

def main():
    # 创建Connection连接
    conn = pymysql.connect(host="localhost", port=3306, user="root", password="zxy100300", database="myfirst")
    # 获得Cursor对象
    csl = conn.cursor()
    print("请输入需要查找的名字:")
    find_name = input()
    sql = 'select * from heros where name="%s"' % find_name
    # 执行sql语句
    count = csl.execute(sql)
    print("查询到%d条数据:" % count)

    for i in range(count):
        result = csl.fetchone()
        print(result)

    csl.close()
    conn.close()

    #输入注入语句" or 1=1 or"
if __name__ == '__main__':
    main()

运行程序,用户可以正常输入人名进行查询。

然而,如果输入漏洞注入命令 “or 1=1 or”
将会把数据库中所有的数据干出来(我这里总共只有两条数据)

原因分析:
实现注入的程序语句是这条:

sql = 'select * from heros where name="%s"' % find_name

其中,字符串由一对双引号进行包裹。
因此,"or 1=1 or"中,一前一后两个引号实现各自配对,中间的1=1永远成立,因此返回值为1。
将其代入,就会得到这条查询命令:

 select * from heros where name="" or 1=1 or "";

等价于

select * from heros where true;

条件始终成立,因此所有的数据全部被暴露出来。
这,就实现了一次sql注入。

防sql注入

sql注入很难从根本上防止,因此,防止sql注入就需要对数据进行过滤,防止恶意数据的输入。
下面就是用元组对数据进行包裹,用execute本身的函数机制防止注入命令。

import pymysql


def main():
    # 创建Connection连接
    conn = pymysql.connect(host="localhost", port=3306, user="root", password="zxy100300", database="myfirst")
    # 获得Cursor对象
    csl = conn.cursor()
    print("请输入需要查找的名字:")
    find_name = input()
    params = [find_name]
    # 执行sql语句
    count = csl.execute('select * from heros where name=%s', params)
    print("查询到%d条数据:" % count)

    for i in range(count):
        result = csl.fetchone()
        print(result)

    csl.close()
    conn.close()

    # 输入注入语句"or 1=1 or"


if __name__ == '__main__':
    main()

效果:

注入语句成功失效。

下面是一张几年前看到的网络笑话图,当时没看懂,现在理解了。。

以上是关于MySQL学习9:数据库模块pymysql的使用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库学习第十二篇pymysql模块

python之pymysql模块学习(待完善...)

Mysql学习日记-04pymysql的运用

(数据科学学习手札51)用pymysql来操控MySQL数据库

Python连接MySQL数据库之pymysql模块使用

Python连接MySQL数据库之pymysql模块使用