Python操作MySQL及多数据SQL注入

Python操作MySQL

我们想要在Pycharm里面操作MySQL需要安装一个模块 pymysql模块
如果没有下载cmd中 pip install pymysql 或者直接pycharm中 import pymysql 点击小灯安装即可

在这里插入图片描述


		import pymysql
		conn = pymysql.connect(host='127.0.0.1',
							   port=3306, user='root', 
							   password='123', database='likes', 
							   charset='utf8mb4', autocommit=True)  # 链接服务器
		cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象(等待输入 相当于光标处等待输入)
		# 注意括号内内容没有写全 cursor=pymysql.cursors.DictCursor 则结果不会显示表格的信息名称
		sql1 = 'select * from dep1'     # 编写SQL语句
		cursor.execute(sql1)            # 发送给服务器
		res = cursor.fetchall()         # 获取命令的执行结果
		print(res)

		cursor.fetchall() # 获取结果中所有的数据
		cursor.fetchone() # 获取结果中一条数据
		cursor.fetchmany(# 获取结果集中指定的数据(括号内写入数字几获得几条数据)
		cursor 类似于光标 第一次获取完 再次获取的消息就丢失了 基于当前位置往后移动

		'''pycharm 里面写入SQL语句会飘黄 不用在意'''

在这里插入图片描述

SQL注入问题

	先用SQL语言编写一个用户登录
		import pymysql
		conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='likes',
		                       charset='utf8mb4', autocommit=True)  # 链接服务器
		cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
		username = input('请输入您的账号:>>>>:').strip()
		password = input('请输入您的密码:>>>>:').strip()
		sql = "select * from new where name='%s' and pwd='%s'" % (username, password)
		cursor.execute(sql)
		res = cursor.fetchall()
		# print(res)    # 如果成功打印结果
		if res:
		    print('登录成功')
		else:
		    print('用户名或密码错误')

在这里插入图片描述

这个时候我们发现可以登录成功了 这么轻松吗?
这才开始 !!! 为什么输入没输入密码就登录成功了

在这里插入图片描述
在这里插入图片描述

	select * from new where name='xxx' or 1=1 -- asdadqdqdw' and pwd=''
	select * from new where name='like' -- asdqdqdq1d1' and pwd=''
	
	我们发现是我们在输入SQL语句的时候 达到了注释语法把后面给注释掉了 只有用户名是对的 就对了
	第一个是where后面结果如果是TRUE的话 那就算对

所以SQL注入的本质就是 利用一些特殊符号的组合产生了特殊的含义从而逃脱了正常的业务逻辑

措施就是 针对用户输入的数据不能输入符号什么的 这就是为什么很多网站账号不允许输入特殊符号的原因 所以用户输入的数据不要自己处理 交给专门的方法自动过滤

 sql = "select * from new where name=%s and pwd=%s"
 cursor.execute(sql, (username, password))  # pymysql会自动识别%s 并自动过滤各种符合 最后合并数据

在这里插入图片描述

知识点补充

cousor.executemany()
它的用法我们也知道就是一次性插入多行数据

import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='likes',
                       charset='utf8mb4', autocommit=True)  # 链接服务器
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into new(name,pwd) values(%s,%s)'
cursor.executemany(sql, [('jack', 123), ('lebron', 123), ('lisa', 123)])

在这里插入图片描述

as语法 给字段起别名、起表名 (为了见名知意)

select name as '名称' from new;	# name后面跟上as 输入新的名称即可

在这里插入图片描述

comment语法 # 给表、字段添加注释信息

 	create table server(id int) comment '这个server意思是服务器表'
	create table t1(
       id int comment '用户编号',
       name varchar(16) comment '用户名'
    ) comment '用户表';
   
   '''
   	两个可以查询注释的地方
   		show create table 表名
   		use information_schema 默认没有权限直接查看
   '''

concat、concat_ws语法
concat用于分组之前多个字段数据的拼接
concat_ws如果有多个字段 并且分隔符一致 可以使用该方法减少代码

select concat(name,pwd) from new;
select concat_ws('|',name,pwd) from new;

在这里插入图片描述
在这里插入图片描述

exists语法
exists后面的sql语句如果有结果那么执行前面的sql语句 如果后面没有结果则不执行

select * from emp1 where exists (select * from emp where id < 10);

在这里插入图片描述
在这里插入图片描述

技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点点赞收藏+关注 谢谢支持 !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoisMay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值