pymysql简介

pymysql是python操纵mysql的一个模块,本质上是一个socket客户端

## pymysql使用

准备数据

#创建数据库db2,如果已存在,请忽略
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8;
#创建用户表
CREATE TABLE `userinfo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(20) NOT NULL COMMENT '用户名',
`password` varchar(32) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; #插入一条数据
INSERT INTO `db2`.`userinfo` (`id`, `username`, `password`) VALUES ('1', 'helln', '123');

### 实现

使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)

#导入模块
import pymysql user = input('请输入用户名:')
pwd = input('请输入密码:') # 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db2', charset='utf8') # 2.创建游标
cursor = conn.cursor() # 注意%s需要加引号
sql = "select * from userinfo where username='%s' and password='%s'" % (user, pwd)
print('sql语句:',sql) # 3.执行sql语句
cursor.execute(sql) result = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录数目
print('返回记录数:',result) # 关闭连接,游标和连接都要关闭
cursor.close()
conn.close() if result:
print('登陆成功')
else:
print('登录失败')

演示

输入正确用户名和密码

请输入用户名:helln
请输入密码:123
sql语句: select * from userinfo where username='helln' and password='123'
返回记录数: 1
登陆成功

输入错误时
```
请输入用户名:helln
请输入密码:234
sql语句: select * from userinfo where username='helln' and password='234'
返回记录数: 0
登录失败


<br>
## sql注入 sql注入有两种形式:用户名存在绕过密码、用户不存在绕过用户名和密码 ### 用户名存在绕过密码
格式

存在的用户名' -- 任意字符

或者

存在的用户名' #任意字符

<br>
测试'--

请输入用户名:helln' -- skdjfskdf

请输入密码:sdf

sql语句: select * from userinfo where username='helln' -- skdjfskdf' and password='sdf'

返回记录数: 1

登陆成功

![](https://img2018.cnblogs.com/blog/1542801/201904/1542801-20190406203845450-1859590627.png)

<br>
测试' #

请输入用户名:helln' #lsjefls

请输入密码:woieurweio

sql语句: select * from userinfo where username='helln' #lsjefls' and password='woieurweio'

返回记录数: 1

登陆成功

![](https://img2018.cnblogs.com/blog/1542801/201904/1542801-20190406203917915-1917128048.png)

在navicat中可以看到-- 和#后面的都被注释掉了,所以只有username='helln'起作用,自然也就能够查询到结果

<br>
### 用户名不存在,绕过用户名和密码 格式

任意用户名' or 1=1 -- 任意字符

或者

任意用户名' or 1=1 #任意字符

或者

任意用户名' or '任意字符'='任意字符

<br>
注意:
- 用户名后面有一个单引号
- or前后都有空格
- 必须保证等式成立 <br>
测试

请输入用户名:sfhgk' or 1=1 -- sfjeor

请输入密码:vnxlngf' or 2=2 #sdfwer

sql语句: select * from userinfo where username='sfhgk' or 1=1 -- sfjeor' and password='vnxlngf' or 2=2 #sdfwer'

返回记录数: 1

登陆成功


<b><font color='#ff0000'>sql注入的本质是(通过注释)构造恒为真的表达式绕过验证</font></b> <br>
## 解决办法 原来我们是用字符串拼接做的
```python
sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd)
print(sql)
result=cursor.execute(sql)

将上面的语句改为下面这样,注意一定不要再加引号了

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

## commit()提交
在数据库里增、删、改的时候,必须要进行提交,否则插入的数据不生效。


### 增

#导入模块
import pymysql user = input('请输入用户名:')
pwd = input('请输入密码:') # 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db2', charset='utf8') # 2.创建游标
cursor = conn.cursor() sql = "insert into userinfo(username,password) values (%s,%s)"
print('sql语句:',sql) # 3.执行sql语句,返回sql查询成功的记录数
#同时插入多条数据
result = cursor.executemany(sql,[(user+'1',pwd),(user+'2',pwd)])
print('返回记录数:',result) #一定记得commit
conn.commit() # 关闭连接,游标和连接都要关闭
cursor.close()
conn.close() #判断结果
if result:
print('ok')
else:
print('error')

### 改
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#导入模块
import pymysql

user = input('请输入用户名:')

pwd = input('请输入密码:')

1.连接

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

2.创建游标

cursor = conn.cursor()

sql = "update userinfo set username = %s where id = '8'"

print('sql语句:',sql)

3.执行sql语句,返回sql查询成功的记录数

修改一条数据

result = cursor.execute(sql,user)

print('返回记录数:',result)

一定记得commit

conn.commit()

关闭连接,游标和连接都要关闭

cursor.close()

conn.close()

判断结果

if result:

print('ok')

else:

print('error')

<br>

### 删
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#导入模块
import pymysql #删除不需要执行这2个input了
# user = input('请输入用户名:')
# pwd = input('请输入密码:') # 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db2', charset='utf8') # 2.创建游标
cursor = conn.cursor() sql = "delete from userinfo where id = '2'"
print('sql语句:',sql) # 3.执行sql语句,返回sql查询成功的记录数
#删除一条数据
result = cursor.execute(sql)
print('返回记录数:',result) #一定记得commit
conn.commit() # 关闭连接,游标和连接都要关闭
cursor.close()
conn.close() #判断结果
if result:
print('ok')
else:
print('error')

查有三种:fetchone()fetchall()fetchmany

fetchone():获取下一行数据(第一次使用时是首行),返回值是一个元组

#导入模块
import pymysql # 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db2', charset='utf8') # 2.创建游标
cursor = conn.cursor() sql = 'select * from userinfo'
cursor.execute(sql) # 查询第一行的数据
row = cursor.fetchone()
print(row) # (1, 'helln', '123') # 查询第二行数据
row = cursor.fetchone()
print(row) # (6, 'sophia', '123') # 4.关闭游标
cursor.close() # 5.关闭连接
conn.close()

在fetchone示例中,在获取行数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能再获取到行的内容,所以我们可以使用如下方法来移动行指针:
```python
cursor.scroll(1,mode='relative') # 相对当前位置移动,整数向下移动,负数向上移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动
```


fetchall(): 获取所有数据,返回值是元组套元组
```python
#导入模块
import pymysql

1.连接

conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db2', charset='utf8')

2.创建游标

cursor = conn.cursor()

sql = 'select * from userinfo'

cursor.execute(sql)

获取所有的数据

rows = cursor.fetchall()

print(rows)

4.关闭游标

cursor.close()

5.关闭连接

conn.close()

默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:
```python
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor

fetchmany(): 获取多行记录,括号内的参数为获取的行数
```python
#导入模块
import pymysql

1.连接

conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db2', charset='utf8')

2.创建游标

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'select * from userinfo'

cursor.execute(sql)

获取2条数据

rows = cursor.fetchmany(2)

print(rows)

4.关闭游标

cursor.close()

5.关闭连接

conn.close()

pymysql的使用及sql注入的更多相关文章

  1. MySQL 之Navicat Premium 12安装使用、pymysql模块使用、sql注入问题的产生与解决

    本文内容提要: Navicat Premium 12 的介绍.使用. pymysql模块的使用 sql注入问题的产生与解决 -------------------------------------- ...

  2. MySQL— pymysql模块(防止sql注入),可视化软件Navicat

    一.Pymysql import pymysql #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一样的 #pymysql可以伪装成上面这两个模块 user = in ...

  3. pymysql 解决 sql 注入问题

    1. SQL 注入 SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作. 即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数 ...

  4. Navicat工具、pymysql模块 sql注入

    cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...

  5. 第二百八十一节,MySQL数据库-SQL注入和pymysql模块防止SQL注入

    MySQL数据库-SQL注入和pymysql模块防止SQL注入 SQL注入就是通过SQL语句绕开程序判断,获取到数据库的内容 下面以一个简单的程序登录SQL注入举例: 正常登录 1.数据库有一张会员表 ...

  6. PyMySQL防止SQL注入

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  7. MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

    目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...

  8. python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作

    pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...

  9. 数据库——可视化工具Navicat、pymysql模块、sql注入问题

    数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...

随机推荐

  1. Kafka设计解析(六)- Kafka高性能架构之道

    本文从宏观架构层面和微观实现层面分析了Kafka如何实现高性能.包含Kafka如何利用Partition实现并行处理和提供水平扩展能力,如何通过ISR实现可用性和数据一致性的动态平衡,如何使用NIO和 ...

  2. gulp结合Thinkphp配置

    gulpfile.js文件 /*! * gulp * $ npm install gulp gulp-ruby-sass gulp-cached gulp-uglify gulp-rename gul ...

  3. Linux查看mysql 安装路径和运行路径

    一.查看文件安装路径 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以mysql为例.比如说我安装了mysql,但是不知道文件都安装在哪些地方.放在哪些文件夹里,可以用 ...

  4. CSAPP:第九章 虚拟内存

    CSAPP:第九章 虚拟内存 关键点:虚拟内存.物理内存 9.1 物理地址和虚拟地址9.2 地址空间9.3 虚拟内存作为缓存的公工具 9.1 物理地址和虚拟地址   计算机的主存被组织成一个由M个连续 ...

  5. keras 的 Deeplabv3+ 实现遇到的问题

    代码大佬都已经写好了,具体参考:https://github.com/bonlime/keras-deeplab-v3-plus git clone 下来以后,按照指南要训练自己的数据集,只要设置好自 ...

  6. 互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿

    有了人的地方,就会有江湖. 有江湖的地方,就会有门派. 有门派的地方,就会有纷争. 有纷争的地方,就会有兴衰. 2018年马上就要离我们远去了,迎接我们的将会是新的一年——2019年.在整个过去的20 ...

  7. 最简单易懂的Spring Security 身份认证流程讲解

    最简单易懂的Spring Security 身份认证流程讲解 导言 相信大伙对Spring Security这个框架又爱又恨,爱它的强大,恨它的繁琐,其实这是一个误区,Spring Security确 ...

  8. Leetcode 21. Merge Two Sorted Lists(easy)

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  9. Linux重启命令

    Linux和windows不同,linux后台运行着许多进程,所以强制关机可能会导致进程的数据丢失使系统处于不稳定的状态.甚至在有的系统中会损坏硬件设备.而在系统关机前使用shutdown命令,系统管 ...

  10. MySQL系列:数据类型、运算符及函数(5)

    1. 数据类型 MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. (1)数值类型:包括整数类型:TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT,   ...