程序猿大战Python——Python与MySQL交互三

news2024/9/20 14:46:57

SQL注入

==目标:==了解什么是SQL注入?

SQL注入指的是:恶意篡改或注入SQL条件。

当开发者的数据条件若被恶意篡改,那就达不到预期的查询效果。

为了了解SQL注入是怎么回事?通过一个案例来分析。

例如,使用命令来完成:

(1)给学生表tb_student中添加一些数据,查看效果;

(2)查询age=22的这条数据的所有信息;

(3)使用SQL注入方式来恶意篡改查询条件,比如在条件结尾处,添加or 1=1,并查询结果;

(4)思考:对比两次查询结果,该如何解决这类SQL注入问题呢?

###################SQL注入#########################
# 使用库
use sz38db_students;
# 插入几条数据
insert into student(name, gender, age) values ('周行','男',22);
insert into student(name, gender, age) values ('赵雪珂','女',22);
# 查询 age = 22
select * from student where age=22;
# 篡改条件  SQL注入
# select * from student where age=22 or age>0;
select * from student where age=22 or 1=1;
# 避免问题产生?  -语句参数化

==总结:==

(1)恶意篡改或注入新的SQL条件的行为叫做();==A、SQL注入==;B、SQL添加;

(2)注意:当恶意篡改了SQL条件后,查询的结果可能达不到预期效果。

语句参数化

==目标:==掌握语句参数化的使用。

如果要解决SQL注入的问题,在pymysql模块中,可采用语句参数化来解决。

语句参数化是指以%s表示值,然后再传入具体的参数值进行替换。

为了更好理解语句参数化,可以把SQL语句的参数化、值,简要地理解为print()函数中的格式化符号输出:

print("xxx%s, xxx%d"%(name, age))

要使用cursor对象的函数:

函数含义
execute(operate, param)用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数的类型是列表list。

例如,使用pymysql模块来完成:

(1)通过键盘录入的方式输入变化的数据值;

(2)使用语句参数化和execute()给数据表添加一条数据内容;

(3)操作完成后,使用DataGrip查看添加成功后的数据结果。

# 1.导入模块
import pymysql
​
# 2.创建连接对象
db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_students",
    charset="utf8"
)
# 3.创建游标对象
db_cursor = db_conn.cursor()
# 4.编写SQL执行
name = input("请输入姓名:")
gender = input("请输入性别:")
age = int(input("请输入年龄:"))
params = [name,gender,age]
sql = "insert into student(name,gender,age) values(%s,%s,%s)"  # 不管什么类型的数据,都是使用%s替换
# sql = "insert into student(name,gender,age) values(%s,%s,%d)"  # 错误
db_cursor.execute(sql,params)
​
# *5.提交事务
db_conn.commit()
# 6.关闭游标
db_cursor.close()
# 7.关闭连接
db_conn.close()
print("数据操作已完成!!")

==总结:==

(1)请问:语句参数化时,必须使用%s表示参数,这句话正确吗?==A、正确==;B、错误;

(2)注意:要进行语句参数化时,使用execute()方法时需要传递两个参数。

查询数据

==目标:==掌握pymysql查询数据操作。

查询数据,要使用cursor对象的函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。
fetchone()在执行查询语句时,获取查询结果集的第一行数据,返回一个元组,即(v1, v2,...)。
fetchall()在执行查询时,获取结果集的所有行,返回一个元组,即((v11, v12,...), (v21, v22,...),...)。

说明:

查询的数据结果是元组类型。

例如,使用pymysql模块来完成:

(1)使用fetchone来查询一条某xx姓名的数据信息;

(2)使用fetchall()查询出所有数据信息,并遍历出详细信息。

import pymysql
​
db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_students",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行查询语句
# sql = "select * from student where name=%s"
# name = input("请输入姓名:")
# # params = [name,]
# params = [name]
# db_cursor.execute(sql,params)
# # fetchone()
# result = db_cursor.fetchone()
# print(f"查询一条结果:{result}")
​
# sql = "select * from student where name=%s"
sql = "select name from student where name=%s"
name = input("请输入姓名:")
# params = [name,]
params = [name]
db_cursor.execute(sql,params)
# fetchone()
result = db_cursor.fetchone()
print(f"查询一条结果:{result}")
# print(f"查询一条结果:{result[1]}")
​
# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据查询已结束!~~")
import pymysql
​
db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_students",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行查询语句
sql = "select * from student"
db_cursor.execute(sql)
# fetchall()
result = db_cursor.fetchall()
print(f"查询所有结果:{result}")
​
for student in result:
    print(student)
​
for id,name,gender,age in result:
    print(name)
​
# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据查询已结束!~~")

==总结:==

(1)当要获取所有查询结果数据时,可以使用()方法;A、fetchone();==B、fetchall()==;

(2)注意:虽然查询数据无需提交事务,但还是建议提交一下,这样可以避免与CRUD的差异化。

注册与登录案例

注册

==目标:==了解注册用户的使用。

比如,在登录某网站前,是需要进行注册用户的。那么,注册是怎么做的呢?

其实,注册用户本质上就是给用户表添加一条数据。

例如,一起来完成:

(1)新建一个班级db_users数据库,编码为utf8;

(2)在库中新建一个用户表,字段有:编号id[主键自增]、用户名username、密码password;

(3)使用键盘录入数据的形式输入用户名、密码,并用于注册一个用户;

(4)使用DataGrip查看注册成功后的用户数据结果。

import pymysql
​
db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行插入语句
in_name = input("请输入用户名:")
in_pwd = input("请输入密码:")
params = [in_name,in_pwd]
sql = "insert into tb_user(username,password) values(%s,%s)"
db_cursor.execute(sql,params)
​
# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")

==总结:==

(1)当要注册用户时,本质上实现的是()功能;==A、插入数据==;B、查询数据;

(2)注意:使用pymysql模块操作注册功能时,记得进行语句参数化。

登录

==目标:==掌握如何进行登录操作。

当成功注册用户信息后,则可以进行登录操作了。那么,登录是怎么做的呢?

其实,登录账户本质上就是:查询用户数据,并与用户手动输入的用户名和密码进行匹配。

当匹配成功,则可以登录;反之,则登录失败。

例如,一起来完成:

(1)使用键盘录入数据的形式输入用户名、密码,并用于登录操作;

(2)当登录时,使用的数据内容则是已注册成功的用户表信息;

(3)观察注册成功后的用户数据,当已匹配成功,则表示成功登录。

import pymysql
​
db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行查询语句、匹配
sql = "select username,password from tb_user"
db_cursor.execute(sql)
query_result = db_cursor.fetchall()
print(query_result)
​
# 匹配
in_uname = input("请输入用户名:")
in_upwd = input("请输入密码:")
# for user in query_result:
for username,password in query_result:
    if in_uname == username and in_upwd == password:
        print(f"恭喜你,{username}, 已登录成功!!")
        break  # 跳出
else:
    print("登录失败!!!")
​
# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")
​
# 需求:
# 1.根据上述sql无法知道是用户名或密码哪个出错了, 若要知道到底是哪个出错, 做新需求??   select username from tb_user where password=xx;
# 2.注册和登录账户时,应该要给密码加密处理? 做新需求?? -hashlib库   [MD5 =32位]  [SHA1 = 40位]  ==>学习: 是什么? 使用API?  实战开发?
# https://tool.lu/encdec/
​
# *3.验证码? 邮箱号、手机号等?  --新增字段、添加数据等??

==总结:==

(1)在Python中,如果要判断数据内容是否匹配成功可以使用()语句;==A、if==;B、where;

(2)注意:在实际应用中,登录和注册功能可能还会涉及到用户数据加密,比如MD5加密、SHA1加密等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3【实战】创建项目、创建并提交代码到远程仓库,安装 SASS, 清除浏览器默认样式 reset-css, 清除模板代码,提升开发效率的必要集成

新建远程仓库(码云) https://gitee.com/ 得到远程仓库地址 https://gitee.com/sunshine39/ec-web-vue3.git创建项目 vscode 安装插件 vue3-snippets-for-vscode安装 node v20.12.2设置淘宝镜像 npm config set registry https://registry.npmmirror.c…

Linux 的启动流程

第一步、加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 以我的电脑为例,/boot 目录下面大概是这样一些文件: $ ls /bootconfig-3.2.0-3-amd64config-3.2.0-4-amd64grubinitrd.img-3.2.0-3-amd64initrd.img-3.2.0-4-amd6…

laravel对接百度智能云 实现智能机器人

创建API Key和 Secret Key进入网址:百度智能云千帆大模型平台 如下图操作: 填写完毕点击确认后,即可得到sk和ak 后端接口实现代码: //调用百度智能云第三方机器人接口public function run($text) {$curl curl_init();curl_setop…

I/O系统

1. I/O接口 接口可以看做两个系统或两个部件之间的交接部分,它既可以是两种硬设备之间的连接电路,也可以是两个软件之间的共同逻辑边界。 I/O接口通常是指主机与I/O设备之间设置的一个硬件电路及其相应的软件控制。 2. 程序查询方式 程序查询方式是一…

代码统计工具V1.0.0(支持各种文件类型)

点击下载《代码统计工具(支持各种文件类型)》 1. 前言 本文介绍了一款使用C#开发的代码行数统计软件。该软件允许用户通过选择文件目录和设置统计项目类型,来统计指定目录下的代码行数。软件提供了三种统计方式:按文件名统计、按…

虹科技术丨Linux环境再升级:PLIN驱动程序正式发布

来源:虹科技术丨Linux环境再升级:PLIN驱动程序正式发布 原文链接:https://mp.weixin.qq.com/s/N4zmkYXTPr7xm-h2s7QiLw 欢迎关注虹科,为您提供最新资讯! #PLIN #LIN #LIN接口 导读 Linux驱动程序领域再添新成员&am…

关于RAG优化的几个小技巧

一、背景说明 RAG技术为大型语言模型(LLMs)提供了从数据源检索到的信息,以支撑其生成的答案。简而言之,RAG就是搜索加上LLM提示,你让模型在提供的信息上下文中回答问题。查询和检索到的上下文都被注入到发送给LLM的提…

js删除el-table删除新增项,有的已经保存有的未经保存

有时候在弹窗中的弹窗要删除数据,有的是刚新增进来的,没有经过保存就没有id,有的已经保存过就有id 根据情况设定是否为编辑模式,如果为编辑模式就需要进行筛选删除及接口,如果不是编辑模式,只需要进行筛选删除 this.editFlag true; // 为编辑模式// 删除伤亡名单handelDel() …

基于高通8155的SNPE-PTQ量化方法介绍

一、基于高通8155的SNPE-PTQ量化与打包 量化位置与工作目录,snpe1.51与1.43环境结构相同,下面以1.51为例介绍: SNPE1.51量化:172.20.84.162:/media/share_31.106SNPE1.43量化:172.20.65.2:/media/share_31.106 脚本…

离线翻译软件哪个好用?5款离线翻译器带你解决语言交流难题~

熬过了高考这一大关,也是时候给自己放放松,奖励自己一趟说走就走的旅行了!正好这不周边几个国家都开放了免签政策,借此机会出国游也是一个不错的选择~ 不过出国旅行最怕的还是沟通问题,幸运的是现在可有不少好用的离线…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1,参数2,参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1:输出窗口归类使用,你写什么它就显示什么 参数2&#x…

二叉树基础篇

目录 一.树形结构 二.基本概念 三.二叉树种类及性质 1.满二叉树 2.完全二叉树 3.完满二叉树 4.平衡二叉树 5.二叉树的性质 6.性质相关习题 四.二叉树的存储方式 五. 二叉树的遍历方式 六.二叉树的定义 一.树形结构 树是一种非线性的数据结构,它是由n&#…

SAP QM 取消UD 决策

SAP QM 取消UD 决策。 SAP提供了相关Notes用于取消UD决策。 C24010PA 这个批次已经做了UD 决策 C24010PA目前库存已经是非限制库存 执行操作 成功后检查,自动产生了322,检验批状态也变回来了。 取消原来的生产入库也是Ok的。 测试成功。 需要用到以下两个Notes。 Notes(S…

【深度学习】深度学习基础

李宏毅深度学习笔记 局部极小值与鞍点 鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。 鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(critical point)。损失没有办法再下…

【机器学习】自然语言处理的新前沿:GPT-4与Data Analysis

目录 1、生成二维码Prompt:请用二维码编码这个信息,我爱chatgpt2、分析PDFPrompt:请分析这篇pdf的主要内容,用中文输出分析结果,100字3、设计网站Prompt:请帮我设计一个网站,网站的主题是哪吒玩…

下穿隧道结构安全该如何保证,检测跟自动化监测该如何抉择

隧道监测背景: 隧道所处的地下环境较为复杂,易受地质条件恶化、结构损伤、退化失稳以及自然灾害等因素影响,引发隧道拱顶开裂、边墙开裂、衬砌损坏、隧道渗漏水、围岩大变形等病害,从而导致隧道安全事故发生,尤其在长期…

查普曼大学团队使用惯性动捕系统制作动画短片

道奇电影和媒体艺术学院是查普曼大学的知名学院,同时也是美国首屈一指的电影学院之一,拥有一流电影制作工作室。 最近,道奇学院的一个学生制作团队接手了一个项目,该项目要求使用真人动作、视觉效果以及真人演员和CG角色之间的互动…

斜光测距的原理及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目,东西不多,但是很有意思,值得拿出来学一学。项目里面需要比较精确的定位功能,将前人matlab代码移植到python上,并且做了一些优化,简化逻辑(毕竟我是专业的…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示: 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…