【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda 出现HTTP000报错的解决方法

在使用Anaconda 安装python的时候遇到这个错误 chenchen-Standard-PC-i440FX-PIIX-1996:~$ conda create -n sdwebui python3.10.9Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/r/noarch/repodata.jso…

如何跨渠道分析销售数据 - 6年软件销售经验小结

如何跨渠道分析销售数据 - 6年软件销售经验小结&#xff08;1&#xff09; 【前言】 在我过去6年销售工作生涯中&#xff0c;从第一年成为公司销冠后&#xff0c;我当时的确自满的一段时间&#xff0c;认为自己很了不起。但是第一年的销售业绩并没有拿到提成&#xff0c;最终…

架构设计之安全性属性深度剖析:从理论到实践的完美融合

文章目录 引言一、安全性属性的理论探讨1.1 定义说明1.2 安全原则1.3 安全模型1.4 安全机制 二、安全性属性的实践应用2.1 安全风险评估2.2 架构设计中的安全考虑2.3 技术手段和工具2.4 团队协作与沟通2.5 安全政策和流程2.6 合规性和标准2.7 持续监控和改进 三、理论与实践的融…

c++中 unordered_map 与 unordered_set 用法指南

unordered_map 与 unordered_set 区别与联系 unordered_map 和 unordered_set 都是 C 标准模板库&#xff08;STL&#xff09;中的容器&#xff0c;它们使用哈希表作为底层数据结构&#xff0c;提供了快速的查找、插入和删除操作。下面是它们之间的联系与区别&#xff1a; 联系…

大数据分析统计

大数据分析统计 from datetime import datetimeimport pandas as pd import matplotlib.pyplot as pltpm25files [PM2.5_2021.csv, PM2.5_2022.csv, PM2.5_2023.csv] pm10files [PM10_2021.csv, PM10_2022.csv, PM10_2023.csv]def read_csv_file(files):# 每个文件都有表头…

ch5链路层和局域网

回顾TCP/IP参考模型&#xff0c;明确链路层和物理层在整个模型中的地位&#xff0c;简要提出链路层要解决的问题是单段链路的数据传输&#xff0c;物理层解决的是数字信号与电气信号之间的相互转换。 链路层概述 节点&#xff1a;主机和路由器(包括网桥和交换机) 链路&#xf…

移动端路由切换解决方案 —— 虚拟任务栈让你的 H5 像APP一样丝滑

目录 01: 前言 02: 通用组件&#xff1a;trigger-menu 和 trigger-menu-item 构建方案分析 03: 通用组件&#xff1a;构建 trigger-menu 和 trigger-menu-item 04: 前台业务下 H5 的应用场景 05: 通用组件&#xff1a;transition-router-view 构建方案分析 与 虚拟任务栈…

04Linux文件系统

课程目标 1、了解Linux操作系统的硬盘分区信息 2、了解Linux操作系统重各目录的作用 3、了解Linux的启动级别以及关机和重启命令 课程实验 在xshell中使用df -h &#xff0c;df -T&#xff0c;du -sh,fdisk -|,cd ,pwd 使用top &#xff0c;free&#xff0c;cat/proc/xxx…

ChaosBlade混沌测试实践

ChaosBlade: 一个简单易用且功能强大的混沌实验实施工具 官方仓库&#xff1a;https://github.com/chaosblade-io/chaosblade 1. 项目介绍 ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具&#xff0c;帮助企业提升分布式系统的容错能力&…

面向对象技术

一、基本概念 二、设计原则 三、设计模式的概念与分类 四、创建型模式 五、结构型模式 六、行为型模式 七、Java程序设计

43-5 waf绕过 - 安全狗简介及安装

一、安全狗安装 安装安全狗需要开启 Apache 系统服务。如果 Apache 系统服务未开启,安装过程中可能会出现无法填入服务名称的问题,导致无法继续安装。为避免此问题,可以先在虚拟机中安装 PHPStudy。 安装PHPStudy 下载、安装phpstudy并启动(安装过程可以一路下一步,也…

使用Streamlit和MistralAI创建AI聊天机器人应用

大家好&#xff0c;创建交互式和用户友好型的应用程序通常需要复杂的框架和耗时的开发过程。Streamlit是一个Python库&#xff0c;它简化了以数据为重点的网络应用程序的创建过程&#xff0c;使开发人员和数据科学家能够快速将他们的想法转化为交互式仪表盘和原型。本文将介绍使…

【Java】数据加密

目录 数据加密介绍使用场景密码学历史古代密码学凯撒密码例子特点 维吉尼亚密码原理例子特点 现代密码学介绍 现代密码学的加密算法分类哈希算法优点缺点代码示例【封装写法】 对称加密算法对称加密算法的加密过程解密过程对称加密算法的优点&#xff1a;对称加密算法的缺点&am…

2024 cicsn Ezheap

文章目录 检查 libc2.35利用adddeleeditshow 思路exp结果 检查 libc2.35 利用 add 0x80个chunk&#xff0c;遍历选一个没有被用的&#xff0c;输入的size<0x501,然后malloc后会清零安装输入的size&#xff0c;然后输入内容&#xff0c;长度也是输入的size dele 指定索引…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx&#xff08;发音同engine x&#xff09;是一个异步框架的 Web 服务器&#xff0c;也可以用作反向代理&#xff0c;负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建&#xff0c;并于2004年首次公开发布。同名公司成立于2011年&#xff0c;以提供支持。…

JavaWeb_SpringBootWeb基础

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…

HTML 转义字符(escape characters)及其对应的符号(symbols)

以下是常见的 HTML 转义字符及其对应的符号&#xff0c;这些可以用于在 HTML 或 JSX 中避免解析错误和特殊字符的冲突&#xff1a; 空格 ( ): 或 引号: 单引号&#xff08;&#xff09;&#xff1a;&apos;、&lsquo;、、&rsquo;双引号&#xff08;"&#x…

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

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

面试必问:MySQL死锁是什么,如何解决?(史上最全)

MySQL死锁接触少&#xff0c;但面试又经常被问到怎么办&#xff1f; 最近有小伙伴在面试的时候&#xff0c;被问了MySQL死锁&#xff0c;如何解决&#xff1f; 虽然也回答出来了&#xff0c;但是不够全面体系化&#xff0c; 所以&#xff0c;小北给大家做一下系统化、体系化的…

Matlab里面的浮点数与FPGA定点数的相互转化应用(含Matlab代码,封装成函数可直接调用)

微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 Matlab里面计算通常用的是浮点数&#xff0c;而FPGA在做数字信号处理时&#xff0c;为了节约资源&#xff0c;常常使用的是定点数。在实践中&#xff0c;我们经常需要将Matlab实现中的算法&#xff0c;用FPGA进行实现。 …