pymysql的使用及sql注入

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
登录失败

sql注入

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

用户名存在绕过密码

格式

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

测试‘--

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

测试‘ #

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

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

用户名不存在,绕过用户名和密码

格式

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

注意:

  • 用户名后面有一个单引号
  • or前后都有空格
  • 必须保证等式成立

测试

请输入用户名: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
登陆成功

sql注入的本质是(通过注释)构造恒为真的表达式绕过验证

解决办法

原来我们是用字符串拼接做的

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')

#!/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')

#!/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示例中,在获取行数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能再获取到行的内容,所以我们可以使用如下方法来移动行指针:

cursor.scroll(1,mode='relative')  # 相对当前位置移动,整数向下移动,负数向上移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动

fetchall(): 获取所有数据,返回值是元组套元组

#导入模块
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()

默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor

fetchmany(): 获取多行记录,括号内的参数为获取的行数

#导入模块
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()

原文地址:https://www.cnblogs.com/zzliu/p/10662720.html

时间: 2024-10-10 09:18:58

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

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

一.Pymysql import pymysql #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一样的 #pymysql可以伪装成上面这两个模块 user = input('username: ') pwd = input('password: ') #连接数据库 conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db222') cursor = co

PyMySQL防止SQL注入

一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不通的服务器和数据库特点进行SQL注入攻击 三.SQL注入攻击实例  1.字符串拼接查询,造成注入 import pymysql conn = pymysql.connect(host='127.0.0.1', port=

Navicat工具、pymysql模块 sql注入

cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接mysql服务端的一个工具,并且他是图形界面版的.我们使用它和直接使用命令行的区别就类似linux和windows系统操作起来的一个区别. 下载链接:https://pan.baidu.com/s/

8.22MySQL(五)pymysql模块、sql注入问题

一.基本查询语句及方法补充 1.concat_ws 拼接多个 select concat(name,":",age,":",post,":",salary) from emp; select concat_ws(':',name,age,post,salary) from emp; 上述语句完全等价 2.exist(了解) EXISTS关字键字表示存在. 在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或Fa

exist 存在 Python操作mysql pymysql sql注入问题 # 39

0.补充 exist 存在 了解.py 1 """""" 2 """ 3 '''exist''' 4 EXIST 关键字表示存在 5 在使用EXIST 关键字时 , 6 7 内层查询语句不返回 查询的记录, 8 而是返回一个真假值 ,True|False 9 10 当返回True时,外层语句将进行查询, 11 当返回值为False 外层查询语句不进行查询 12 13 select * from emp where e

Navicat可视化工具的使用、pymysql、sql注入问题

一.Navicat 可视化工具的使用 1.Navicat [1]  是一套快速.可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设. 它的设计符合数据库管理员.开发人员及中小企业的需要.Navicat 是以直觉化的图形用户界面而建的, 让你可以以安全并且简单的方式创建.组织.访问并共用信息. #要求掌握 1:测试+连接数据库 2:新建库 3:新建表,新增字段+类型+约束条件的创建 4:设计表:外键 5:新建查询 6:建立表的模型 7:转储/运行SQL文件 8:通过模型多表

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

目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操作 模型 ***** 特色功能 从数据库建立模型 模型页面基本操作 用模型设计数据库并导出 结构.数据导入导出 导出 导入 附属小功能 刷新小按钮 查看操作对应sql语句 执行时间查看 手动筛选数据 练习 数据准备 使用SQL语句导入表结构与数据 如何验证答案是否正确 题目 部分参考答案(只放了两题的) 少

游标操作/pymysql事务/sql注入/索引

游标操作 import pymysql from pymysql.cursors import DictCursor # 1)建立数据库连接对象 conn conn = pymysql.connect(user='root', passwd='root', db='oldboy') # 2)通过 conn 创建操作sql的 游标对象 cursor = conn.cursor(DictCursor) # 3)编写sql交给 cursor 执行 sql = 'select * from t1' #

13 pymysql模块的 基本使用/ sql 注入的问题/增删改查

import pymysql user=input('用户名: ').strip() pwd=input('密码: ').strip() #连接MySQL conn=pymysql.connect( host='localhost', user ='root', password='888888', database='db10', charset='utf8' ) #游标 cursor=conn.cursor() #执行sql 语句 sql='select * from userinfo wh