【Python从入门到进阶】56、Mysql防止SQL注入及ORM库简化操作

接上篇《55、使用Python轻松操作Mysql数据库》
上一篇我们讲解了Mysql的基本链接和增删改查,本篇我们来介绍链接Mysql时参数化查询与防止SQL注入以及使用ORM(对象关系映射)库简化操作的内容。

一、参数化查询与防止SQL注入

在数据库操作中,SQL注入是一种常见的安全漏洞,它允许攻击者通过注入恶意的SQL代码片段来操纵SQL查询的逻辑,从而可能窃取、修改或删除数据库中的数据。为了防止SQL注入攻击,最佳实践是使用参数化查询或预编译语句(prepared statements)。

1、SQL注入简介

SQL注入攻击发生在用户输入被直接拼接到SQL查询语句中,而没有被适当地验证或转义。攻击者可以构造特殊的输入,使得原本用于筛选或检索数据的SQL语句变得具有破坏性。

例如,假设有一个简单的查询用于检索用户信息:

SELECT * FROM users WHERE username = '$username' AND password = '$password';

如果$username或$password变量直接来自用户输入,并且没有经过适当的验证或转义,那么攻击者可以通过输入类似' OR '1'='1的值来绕过身份验证。

2、参数化查询

参数化查询(或预编译语句)是一种在查询语句中使用参数占位符,并在执行查询之前为这些占位符提供实际值的技术。这种方法确保用户输入不会被解释为SQL代码的一部分,从而防止了SQL注入攻击。

在Python的mysql.connector库中,可以使用参数化查询。下面是一个例子:

import mysql.connector  # 数据库连接配置(省略)  # 连接到数据库(省略)  # 参数化查询示例  
query = "INSERT INTO users (username, password) VALUES (%s, %s)"  
data = ("secure_username", "hashed_password")  cursor.execute(query, data)  # 提交事务并关闭连接(省略)

在上面的例子中,%s是参数占位符,data是一个元组,包含要插入的实际值。这些值在查询执行之前被绑定到占位符上,而不是直接拼接到查询字符串中。

3、为什么要使用参数化查询

使用参数化查询有以下几个好处:

●安全性:通过确保用户输入不会被解释为SQL代码的一部分,参数化查询可以防止SQL注入攻击。
●性能:预编译的语句可以被数据库缓存和重用,这可以提高执行相同或类似查询的性能。
●可读性:使用参数化查询可以使代码更清晰、更易于维护,因为它减少了字符串拼接和格式化的需要。
●类型安全:数据库驱动程序会验证参数的类型和值,这有助于减少由于类型不匹配或无效值导致的错误。

4、如何实施参数化查询

实施参数化查询的具体方法取决于你使用的编程语言和数据库驱动程序。在Python中,使用mysql.connector、sqlite3、psycopg2(对于PostgreSQL)等库时,都可以使用参数化查询(mysql.connector的操作方法如2小结描述)。

在编写代码时,始终遵循以下最佳实践:

●永远不要直接将用户输入拼接到SQL查询语句中。
●使用参数化查询或预编译语句来确保用户输入被安全地处理。
●对所有用户输入进行验证和清理,以防止潜在的攻击向量。
●定期更新和修补你的数据库和数据库驱动程序,以利用最新的安全特性。

通过遵循这些最佳实践,你可以大大降低应用程序受到SQL注入攻击的风险。

二、使用ORM(对象关系映射)库简化操作

在数据库编程中,对象关系映射(Object-Relational Mapping,简称ORM)是一种技术,它允许开发者使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。ORM库在应用程序和数据库之间建立了一个桥梁,通过自动处理数据转换、查询构建和数据库交互等任务,大大简化了数据库操作。

1、ORM的概述

ORM库的主要目标是实现数据库表与编程语言中的类之间的映射。在ORM中,数据库表被映射为类,表中的行被映射为类的实例(对象),而列则被映射为对象的属性。通过操作这些对象,开发者可以间接地操作数据库中的数据。

ORM库通常提供以下功能:

●数据映射:将数据库表映射为类,以及将表中的行和列映射为对象的属性和方法。
●查询构建:允许开发者使用面向对象的方式来构建和执行SQL查询。
●关系管理:处理数据库中的关系(如一对一、一对多、多对多等),并在对象之间建立相应的关联。
●事务管理:提供对数据库事务的支持,确保数据的一致性和完整性。

2、使用ORM库的好处

使用ORM库进行数据库操作有以下好处:

●简化开发:通过面向对象的方式来操作数据库,开发者无需编写大量的SQL语句,降低了开发难度和复杂性。
●提高可维护性:ORM库通常具有良好的封装性和可扩展性,使得代码更加易于维护和扩展。
●减少错误:ORM库能够自动处理数据转换和查询构建等任务,减少了因手动编写SQL语句而导致的错误。
●提高性能:ORM库通常具有缓存机制,能够减少与数据库的交互次数,提高应用程序的性能。

3、流行的ORM库

在Python中,有几个流行的ORM库可供选择,包括SQLAlchemy、Django ORM(Django框架的一部分)、Peewee等。这些库都提供了丰富的功能和灵活的配置选项,可以根据项目的需求选择合适的ORM库。

【SQLAlchemy示例】
SQLAlchemy是一个功能强大的Python ORM库,它支持多种数据库后端,并提供了丰富的API和扩展功能。下面是一个使用SQLAlchemy进行数据库操作的简单示例:

首先,安装SQLAlchemy库(如果尚未安装):

pip install sqlalchemy

然后,使用SQLAlchemy定义数据模型(即数据库表,这里以操作Mysql为例):

# 导入sqlalchemy的Columu类,用于定义模型中的字段
from sqlalchemy import Column, Integer, String
# 导入create_engine函数,用于创建数据库引擎
from sqlalchemy import create_engine
# 导入declarative_base函数,用于创建ORM基类
# 导入sessionmaker类,用于创建会话类
from sqlalchemy.orm import declarative_base, sessionmaker# 定义基础类,继承自declarative_base()返回的基类
Base = declarative_base()# 定义User模型,继承自Base基类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)email = Column(String, unique=True)address = Column(String)# 创建数据库引擎,用于链接数据库
engine = create_engine('mysql+mysqlconnector://root:1234@localhost/test')# 创建会话类,用于与数据库进行交互
Session = sessionmaker(bind=engine)# 创建表(如果表不存在)
Base.metadata.create_all(engine)# 创建一个会话对象
session = Session()# 使用会话对象执行数据库操作
session = Session()
new_user = User(name='韩梅梅', age=16, email='hanmeimei@example.com', address='北京市朝阳区')
session.add(new_user)
session.commit()# 查询用户
print('[查询所有用户]')
users = session.query(User).all()
for user in users:print(user.id, user.name, user.age, user.email, user.address)# 查询姓名为韩梅梅的数据
print('[查询姓名为韩梅梅的用户]')
name_to_search = '韩梅梅'
users = session.query(User).filter_by(name=name_to_search).all()
for user in users:print(user.id, user.name, user.age, user.email, user.address)# 关闭会话
session.close()

在这个示例中,我们首先定义了一个名为User的数据模型,它对应于名为users的数据库表。然后,我们创建了一个数据库引擎和一个会话类,用于与数据库进行交互。接下来,我们使用会话对象执行了插入和查询操作,然后分别查询了全部数据,和按照权限查询数据。最后,我们关闭了会话以释放资源。

新增数据效果:

查询数据效果:

通过使用ORM库(如SQLAlchemy),我们可以更加高效、安全和可维护地进行数据库操作。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/139377496

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

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

相关文章

雄鹰只属于天空

雄鹰只属于天空 成大事者,必有人生至暗时刻之经历,高处坠落折戟沉沙,在孤立无援时,世态炎凉人情冷落,饱经苦楚滋味,所有的热情关系一夜冰封,冷嘲热讽袖手旁观,落井下石四面楚歌&…

互联网简史-分久必合,合久必分

六一儿童节,给孩子们讲讲互联网的历史。 任何当代技术都是古老技术的重组,这是真的。我从电话网络开始,两幅图完事。电波可以承载语音作为最开始,后面的事自然而然: 说实话,网络这种事,它的 …

FPGA中的乒乓操作

为什么不直接选用一个缓存更大的FIFO而选用乒乓操作为什么乒乓操作可以实现低速处理高速数据乒乓操作适用哪些场景 一、乒乓操作结构 首先先介绍一下乒乓操作的原理,其结构如下: 输入选择单元负责将数据送到数据缓冲模块,然后输出选择单元负…

面试题vue+uniapp(个人理解-面试口头答述)未编辑完整....

1.vue2和vue3的区别(vue3与vue2的区别(你不知道细节全在这)_vue2和vue3区别-CSDN博客)参考 Vue3 在组合式(Composition )API,中使用生命周期钩子时需要先引入,而 Vue2 在选项API&am…

使用迭代最近点 (ICP) 算法在 Open3D 中对齐点云

一、Open3D 简介及其功能 Open3D 是一个现代库,它提供了用于处理 3D 数据的各种工具。在其功能中,它提供了高效的数据结构和算法来处理点云、网格等,使其成为在计算机视觉、机器人和图形领域工作的研究人员和从业人员的不错选择。Open3D 的特…

2024 年最新安装MAC-vue教学包括常见错误

花了一上午时间终于将 vue 的工程文件安装好了,本教材是傻瓜式操作,按着教程一步一步操作最后就可以看到页面了。 安装Node 1.在线地址: https://nodejs.org/en 2、点击 Download Node.js下载即可,下载完成后,傻瓜式的…

primeflex Display盒模型显示相关样式实战案例

01 Display盒子模式相关样式 基础样式 ClassPropertieshiddendisplay: none;blockdisplay: block;inlinedisplay: inline;inline-blockdisplay: inline-block;flexdisplay: flex;inline-flexdisplay: inline-flex; 样式说明: hidden:隐藏&#xff0c…

c# 学习教程

打印语句 折叠代码 变量 整形 浮点型 特殊类型

林业调查具体是做些什么?

林业调查是对森林资源进行系统的信息收集和处理的过程。 林业调查涵盖了对林木、林地以及林区内生长的动植物及其环境条件的全面评估,旨在及时掌握森林资源的数量、质量和生长消亡的动态规律。这种调查不仅关注森林本身,还包括与之相关的自然环境和经济…

企业级win10电脑下同时存在Python3.11.7Python3.6.6,其中Python3.6.6是后装的【过程与踩坑复盘】

背景: 需要迁移原始服务器的上的Python3.6.6Flask项目到一个新服务器上, 新服务器上本身存在一个Python3.11.7, 所以这涉及到了一个电脑需要装多个Python版本的问题 过程: 1-确定新电脑版本【比如是32还是64位】 前面开发人员存留了两个…

算法练习第26天|46.全排列、47全排列II

46.全排列 46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/description/ 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1:…

STM32 | 超声波实战

​01、上节回顾 STM32 | HC-SR04 超声波测距模块 | DHT11数字温湿度传感器(第七天)STM32 | 数字温湿度传感器DHT11STM32 | HC-SR04 超声波测距模块STM32 | DHT11数字温湿度传感器实战02、超声波图示 03、超声波头文件 #ifndef __SR04_H#define __SR04_H​#include "stm…

在鸿蒙中身份校验的手势密码的实现

在harmony中它提供了默认的组件PatternLock(); 这个就能直接显示九宫格密码验证 并且他有两个主要的回调事件 .onDotConnect密码输入选中宫格圆点时触发该回调 .onPatternComplete:密码输入结束时触发该回调 //如代码实现 PatternLock().sideLength(32…

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出,一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存,允许其它租户共享使用该内存资源 (root10.0.0.…

vmware 正版免费下载

Broadcom 已经收购了 vmware 并且对普通用户提供免费服务. 那么我们怎么去获取这个玩意呢, 注册完之后打开就是这么个狗屎 , 根本不知道在哪里下载,注册的时候还不能用国内邮箱更是超级狗屎 转到 dashboard 搜索 workstation Pro你会搜索到这么一个奇怪的网址然后…

SSM与Mamba模型学习

transformer的缺陷 自注意力机制的计算范围只限于窗口内,不能直接处理窗口外的元素,不能照顾到整个序列。 由于计算复杂度随着窗口的长度呈几何平方式增长,所以不能一味地增加窗口长度来解决。 Transformer本质上是通过位置编码将序列数据空…

AI在线UI代码生成,不需要敲一行代码,聊聊天,上传图片,就能生成前端页面的开发神器

ioDraw的在线UI代码生成器是一款开发神器,它可以让您在无需编写一行代码的情况下创建前端页面。 主要优势: 1、极简操作:只需聊天或上传图片,即可生成响应式的Tailwind CSS代码。 2、节省时间:自动生成代码可以节省大…

微信小程序-页面配置

一、页面配置文件的作用 小程序中,每个页面都有自己的.json配置文件,用来对当前页面的窗口外观、页面效果等进行配置 二、页面配置和全局配置的关系 小程序中,app.json中的window节点,可以全局配置小程序中每个页面的窗口表现 …

FastDFS分布式文件系统——上传本地文件

目录 安装FastDFS FastDFS 使用Java客户端上传本地文件到FastDFS服务器上 pom.xml fastdfs_conf配置文件 FastDFS 测试 安装FastDFS 1、用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园 (cnblogs.com)2、FastDFS文件上传功能封装 - 动力节点 (bjpowernode.com)…