《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)
文章目录
- 4.1 用户认证和权限控制
- 4.1.1 基础知识
- 4.1.2 重点案例:使用 Python 管理 MySQL 用户权限
- 4.1.3 拓展案例
- 4.2 防止 SQL 注入和其他安全威胁
- 4.2.1 基础知识
- 4.2.2 重点案例:使用 Python 和 MySQL 进行安全的数据查询
- 4.2.3 拓展案例
- 4.3 数据加密和安全备份
- 4.3.1 基础知识
- 4.3.2 重点案例:使用 Python 进行数据库数据加密
- 4.3.3 拓展案例
4.1 用户认证和权限控制
在数据库的世界里,用户认证和权限控制是保护数据安全的第一道防线。正确地管理用户权限,就像是给你的数据库穿上了一件定制的盔甲,既能保护它免受外部攻击,也能防止内部的误操作。
4.1.1 基础知识
- 用户认证:用户认证涉及验证尝试连接到数据库的用户的身份。这通常通过用户名和密码完成,但也可以包括更复杂的机制,如双因素认证。
- 权限控制:一旦用户认证成功,权限控制就是决定用户可以执行哪些操作(如 SELECT、INSERT、UPDATE、DELETE)以及他们可以访问哪些数据。MySQL 提供了精细的权限控制,可以针对不同的数据库、表甚至是列设置不同的权限。
- 角色:角色是一组权限的集合,可以分配给用户。使用角色可以简化权限管理,特别是在有很多用户和复杂权限设置的情况下。
4.1.2 重点案例:使用 Python 管理 MySQL 用户权限
假设你正在开发一个 Python 应用,需要根据用户的角色动态管理他们对 MySQL 数据库的访问权限。
- 创建用户:首先,使用 Python 连接到 MySQL,并为新用户创建账户。
import mysql.connectorconn = mysql.connector.connect(host="localhost",user="admin",password="admin123"
)
cursor = conn.cursor()# 创建新用户
cursor.execute("CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';")
- 分配角色和权限:接着,根据用户的角色为他们分配适当的权限。例如,为数据分析师分配只读权限。
# 为用户分配 SELECT 权限
cursor.execute("GRANT SELECT ON database_name.* TO 'user1'@'localhost';")
conn.commit()
4.1.3 拓展案例
- 动态权限管理:在一个 Web 应用中,根据用户的操作动态调整他们的数据库权限。例如,当一个用户需要上传数据时,临时赋予他 INSERT 权限。
# 检查用户是否有上传权限,并动态授予权限
def grant_upload_permission(user):# 假设已经有逻辑检查用户是否可以上传cursor.execute(f"GRANT INSERT ON database_name.table_name TO '{user}'@'localhost';")conn.commit()# 用户完成上传后,撤销权限
def revoke_upload_permission(user):cursor.execute(f"REVOKE INSERT ON database_name.table_name FROM '{user}'@'localhost';")conn.commit()
- 使用角色简化权限管理:为不同类型的用户(如管理员、编辑、访客)创建角色,并分配相应的权限集,然后将角色分配给用户。
# 创建角色并分配权限
cursor.execute("CREATE ROLE 'editor';")
cursor.execute("GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'editor';")
conn.commit()# 将角色分配给用户
cursor.execute("GRANT 'editor' TO 'user1'@'localhost';")
conn.commit()
通过使用 Python 来管理 MySQL 的用户认证和权限控制,我们可以构建一个灵活且安全的数据访问管理系统。这不仅提高了数据安全性,还增加了管理的灵活性,使得根据实际业务需求调整权限变得简单快捷。记得在实施任何权限变更前都进行彻底的测试,以确保不会意外地限制或过度开放数据访问。
4.2 防止 SQL 注入和其他安全威胁
在数字世界的暗角,SQL 注入仍旧是对数据库安全的一大威胁。这种攻击方式能让黑客通过应用程序的安全缺口执行恶意 SQL 代码,操纵或盗取数据。但别担心,有了正确的知识和工具,我们可以构建起一道防护墙,保护我们的数据库免受这些攻击。
4.2.1 基础知识
- 参数化查询:参数化查询是防止 SQL 注入的关键。通过使用参数化查询,应用程序向数据库发送指令时,数据(用户输入)被明确区分开来,不会被解释为 SQL 代码的一部分。
- 验证用户输入:始终验证和清理用户输入,确保它们符合预期的格式和类型,从而减少恶意输入的机会。
- 最小权限原则:为数据库用户分配仅足够完成任务所需的最低权限,限制潜在的损害范围。
- 使用 ORM:对象关系映射(ORM)工具可以自动将数据转换为强类型的对象,并生成安全的 SQL 语句,进一步降低 SQL 注入的风险。
4.2.2 重点案例:使用 Python 和 MySQL 进行安全的数据查询
假设你正在开发一个 Python Web 应用,需要用户登录功能。
- 使用参数化查询验证用户登录:
import mysql.connector
from mysql.connector import Errordef check_login(username, password):try:conn = mysql.connector.connect(host='localhost', database='mydb', user='user', password='pass')cursor = conn.cursor(prepared=True) # 使用 prepared statementquery = "SELECT * FROM users WHERE username = %s AND password = %s"cursor.execute(query, (username, password)) # 参数化查询result = cursor.fetchone()return result is not Noneexcept Error as e:print(f"Error: {e}")finally:if conn.is_connected():cursor.close()conn.close()# 假设用户输入
user_input_username = "user1"
user_input_password = "password123"
is_authenticated = check_login(user_input_username, user_input_password)
print("Authenticated:", is_authenticated)
4.2.3 拓展案例
- 清理用户输入:在一个博客平台,用户可以提交评论。在处理这些输入之前,验证和清理数据是至关重要的。
# 假设有一个函数来清理用户输入
def clean_input(input_string):# 实现一些基本的清理逻辑,如去除危险字符cleaned_string = input_string.replace("'", "")return cleaned_string# 清理用户评论
user_comment = "Nice post!'; DROP TABLE comments; --"
cleaned_comment = clean_input(user_comment)
# 然后将 cleaned_comment 安全地存储到数据库
- 使用 ORM 避免 SQL 注入:在另一个案例中,假设你使用 SQLAlchemy 作为 Python 应用的 ORM 工具。
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from myapp.models import User # 假设已定义 User 模型DATABASE_URI = 'mysql+mysqlconnector://user:pass@localhost/mydb'
engine = create_engine(DATABASE_URI)
Session = sessionmaker(bind=engine)
Base = declarative_base()# 使用 ORM 查询用户
def query_user(username):session = Session()user = session.query(User).filter(User.username == username).first() # 自动防范 SQL 注入session.close()return user# 查询用户
user = query_user("user1")
print("User found:", user.username if user else "No user found")
通过这些案例,我们看到,防止 SQL 注入和其他安全威胁需要综合考虑多种策略。使用参数化查询、验证用户输入、实施最小权限原则,以及利用 ORM 工具,都是构建安全数据库应用的重要步骤。在 Python 中,这些做法尤其重要,因为它们帮助我们在提供强大功能的同时,确保了应用的安全性。
4.3 数据加密和安全备份
在我们的数据保护策略中,数据加密和安全备份是守护宝藏的最后一道防线。加密确保了即使数据被盗,也无法被未授权者读取。而安全备份则像是在远离敌人的地方藏了一份宝藏的地图,即使原本的宝藏失去,我们也能从备份中恢复它。
4.3.1 基础知识
- 数据加密:包括传输中的加密(如使用 SSL/TLS)和静态数据的加密(存储在数据库中的数据)。静态数据加密可以是透明的(如 MySQL 的透明数据加密),也可以在应用层进行。
- 安全备份:定期备份数据,并确保备份的数据加密且存储在安全的位置。备份策略应包括完整备份和增量备份,以及定期的恢复测试,确保备份在需要时可以正常使用。
- 密钥管理:加密数据需要使用密钥,正确的密钥管理策略是保证加密安全性的关键。这包括密钥的生成、存储、轮换和销毁。
4.3.2 重点案例:使用 Python 进行数据库数据加密
假设你的应用需要存储用户的敏感信息,如社会安全号码。
- 应用层数据加密:
from cryptography.fernet import Fernet# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)# 加密数据
def encrypt_data(data):return cipher_suite.encrypt(data.encode('utf-8'))# 解密数据
def decrypt_data(encrypted_data):return cipher_suite.decrypt(encrypted_data).decode('utf-8')# 使用示例
original_data = '123-45-6789'
encrypted_data = encrypt_data(original_data)
print("Encrypted data:", encrypted_data)decrypted_data = decrypt_data(encrypted_data)
print("Decrypted data:", decrypted_data)
4.3.3 拓展案例
- 加密数据库连接:在 Python 应用和 MySQL 数据库之间的连接使用 SSL 加密。
import mysql.connectorconn = mysql.connector.connect(host='localhost',user='user',password='password',database='mydb',ssl_ca='/path/to/server-ca.pem',ssl_cert='/path/to/client-cert.pem',ssl_key='/path/to/client-key.pem'
)cursor = conn.cursor()
# 执行安全的数据库操作
cursor.close()
conn.close()
- 自动化数据库备份并加密备份文件:使用 Python 脚本定期备份数据库,并使用加密工具加密备份文件。
import os
from subprocess import call
from cryptography.fernet import Fernet# 备份数据库
def backup_database():backup_file = 'database_backup.sql'call(f'mysqldump -u user -ppassword mydb > {backup_file}', shell=True)return backup_file# 加密备份文件
def encrypt_backup(file_path):key = Fernet.generate_key()cipher_suite = Fernet(key)with open(file_path, 'rb') as file:file_data = file.read()encrypted_data = cipher_suite.encrypt(file_data)with open(file_path + '.enc', 'wb') as file:file.write(encrypted_data)os.remove(file_path) # 删除原始备份文件backup_file = backup_database()
encrypt_backup(backup_file)
通过这些案例,我们看到了数据加密和安全备份在保护敏感信息和确保数据可恢复性方面的重要性。在 Python 应用中实施这些策略,不仅可以增强数据安全,还能提高用户对应用的信任度。正确的密钥管理和备份策略也是确保数据安全的关键部分,应该得到充分的关注和实施。
相关文章:

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)
文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例:使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例:使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…...

VUE学习之路——列表渲染
<p v-for"item in items">{{ item }}</p>使用v-for进行列表的渲染。 这仅仅是一个简单的demo,使用v-for可以用来遍历数组和对象,具体如下: 注意:遍历数组或对象的时候,()…...

CentOS 安装 redis 7.2
nginx官网 https://redis.io/download/ 把鼠标放到这里,复制下载地址 在服务器找个文件夹执行命令 wget https://github.com/redis/redis/archive/7.2.4.tar.gz tar -zxvf 7.2.4.tar.gz make make install 看到这几行就说明安装成功了 不放心的话再查看下b…...

运维自动化bingo前端
项目目录结构介绍 项目创建完成之后,我们会看到bingo_web项目其实是一个文件夹,我们进入到文件夹内部就会发现一些目录和文件,我们简单回顾一下里面的部分核心目录与文件。 ├─node_modules/ # node的包目录,项目运行的依赖包…...

Project2013下载安装教程,保姆级教程,附安装包和工具
前言 Project是一款项目管理软件,不仅可以快速、准确地创建项目计划,而且可以帮助项目经理实现项目进度、成本的控制、分析和预测,使项目工期大大缩短,资源得到有效利用,提高经济效益。软件设计目的在于协助专案经理发…...

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总
【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念:标签PCA 主成分分析(Principal Component Analysis)降维算法LSA 潜在语义分析(…...

Mac电脑如何通过终端隐藏应用程序?
在我们使用Mac电脑的时候难免会遇到想要不想看到某个应用程序又不想卸载它们。值得庆幸的是,macOS具有一些强大的文件管理功能,允许用户轻松隐藏(以及稍后显示)文件甚至应用程序。 那么,Mac电脑如何通过终端隐藏应用程…...

linker list
linker list是利用lds 描述符实现同类型数据连续排布的一种机制。 下面是uboot里面的应用说明 lds文件里面需要增加section描述: . ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}linker_list.h: /* SPDX-License-Identifier: GPL-2.0 */ /** include…...

[CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
文章目录 前言一、所需环境二、实现思路2.1. 定义了LeNet网络模型结构,并训练了20次2.2 以txt格式导出训练结果(模型的各个层权重偏置等参数)2.3 (可选)以pth格式导出训练结果,以方便后期调试2.4 C CUDA要做的事 三、C CUDA具体实现3.1 新建.cu文件并填好…...

【开源】基于JAVA+Vue+SpringBoot的数据可视化的智慧河南大屏
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏,包含了GDP、…...

页面单跳转换率统计案例分析
需求说明 页面单跳转化率 计算页面单跳转化率,什么是页面单跳转换率,比如一个用户在一次 Session 过程中访问的页面路径 3,5,7,9,10,21,那么页面 3 跳到页面 5 叫一次单跳,7-9 也叫一次单跳, 那么单跳转化率就是要统计…...

眸思MouSi:“听见世界” — 用多模态大模型点亮盲人生活
文章目录 1. Introduction1.1 APP细节展示2. Demo2.1 论文链接2.2 联系方式3. Experiment3.1 多专家的结合是否有效?3.2 如何更好的将多专家整合在一起?Reference让盲人听见世界,复旦眸思大模型打破视觉界限,用科技点亮新生活 1. Introduction 在这个世界上,视力是探索万…...

电商小程序05用户注册
目录 1 搭建页面2 设置默认跳转总结 我们上一篇拆解了登录功能,如果用户没有账号就需要注册了。本篇我们介绍一下注册功能的实现。 1 搭建页面 打开应用,点击左上角的新建页面 输入页面的名称,用户注册 删掉网格布局,添加表单容…...

什么是UI设计?
用户界面(UI)它是人与机器互动的载体,也是用户体验(UX)一个组成部分。用户界面由视觉设计 (即传达产品的外观和感觉) 和交互设计 (即元素的功能和逻辑组织) 两部分组成。用户界面设计的目标是创建一个用户界面…...

React 实现表单组件
表单是html的基础元素,接下来我会用React实现一个表单组件。支持包括输入状态管理,表单验证,错误信息展示,表单提交,动态表单元素等功能。 数据状态 表单元素的输入状态管理,可以基于react state 实现。 …...

PlantUML绘制UML图教程
UML(Unified Modeling Language)是一种通用的建模语言,广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具,通过简单的文本描述,能够生成UML图,包括类图、时序图、用例图等。PlantUML是一款…...

自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler
django-crontab 和 django-cron 有时候需要django在后台不断的执行一个任务,简单的可以通过中间件来实现,但是中间件是根据请求触发的。如果需要定时执行任务,则需要使用到一些插件。 django-crontab 和 django-cron 是常用的用于处理定时任…...

医院挂号预约|医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
医院挂号预约小程序目录 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 &…...

网络选择流程分析(首选网络类型切换流程)
首先是界面,我在此平台的界面如下: 对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异 然后点击切换按钮会调用到UniEnabledNetworkModePreferenceControlle…...

AutoSAR(基础入门篇)6.1-Vector的汽车电子开发工具链简介
目录 前言 一、PREEvision 二、vVIRTUALtarget 三、DaVinci 四、CANoe 五、CANape 其他 前言 因为国内用...

TI的电量计驱动在卸载时导致Linux卡死
背景 最近移植TI电量计芯片bq40z50的驱动,移植完毕后,能正常读取电池信息了,但是无意中发现驱动卸载会导致Linux卡死,死前终端闪过大量打印,将putty的缓冲区都耗尽了,必须启用syslog转发并用visual syslog…...

使用yolo训练自己的模型
YOLO(You Only Look Once)是一种用于目标检测的深度学习模型,旨在实时检测图像或视频中的多个对象。与传统的目标检测方法不同,YOLO一次性处理整个图像,而不是通过滑动窗口或区域提议进行多次检测。这种方法使得YOLO在…...

堆的概念实现
前言 本文将详细讲解堆。堆是一种二叉树(一般是完全二叉树)使用顺序结构的数组来存储。 tip:这里我们需要注意区分堆在不同地方的含义,这里的堆是一个数据结构,操作系统虚拟进程地址空间的堆是操作系统中管理内存的一块…...

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展
转自 极客时间 Redis主从架构 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …...

pnpm + vite 从外网迁移到内网环境开发
离线安装pnpm 在有外网的机器上执行以下命令,下载pnpm的tgz压缩包至桌面,注意下载版本和当前使用版本保持一致 npm pack -g pnpm7.4.0 --pack-destination ~/Desktop将tgz压缩包拷贝至离线机器在离线机器中执行命令 npm -g i /home/user/offline/pnpm…...

寒假作业7
sql语句 创建表格 create table 表名 (字段名 数据类型,字段名 数据类型) create table if not exists 表名 (字段名 数据类型, 字段名 数据类型) 删除表格 drop table 表名; 插入记录 全字…...

【0257】关于pg内核shared cache invalidation messages (概念篇)
文章目录 1. inval messages2. 可配置参数(Configurable parameters)1. inval messages 所谓“共享缓存无效消息(shared cache invalidation messages)”,从概念上讲,共享缓存无效消息存储在一个无限数组中,其中maxMsgNum是存储提交消息的下一个数组下标, minMsgNum是…...

Nginx 缓存集成、清除、设置不缓存资源
文章目录 前言1. web缓存服务1.1 原理1.2 指令1.2.1 proxy_cache_path1.2.2 proxy_cache1.2.3 proxy_cache_key1.2.4 proxy_cache_valid1.2.5 proxy_cache_min_uses1.2.6 proxy_cache_methods 2. 缓存案例3. 缓存的清除3.1 删除对应的缓存目录3.2 使用第三方扩展模块ngx_cache_…...

C++面试宝典第27题:完全平方数之和
题目 给定正整数 n,找到若干个完全平方数(比如:1、4、9、16、...),使得它们的和等于n。你需要让组成和的完全平方数的个数最少。 示例1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4。 示例2: 输入:n = 13 输出:2 解释:13 = 4 + 9。 解析 这道题主要考察应聘者对于…...

webrtc native api的几个要点
文章目录 基本流程状态回调类sdp的中媒体行pc对象 基本流程 webrtc native的接口,主要就是围绕着PeerConnection对象,一个PeerConnection对象它代表了一次音视频会话。 那么通过PeerConnection对象建立音视频通话,包括如下步骤: …...