当前位置: 首页 > news >正文

《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 数据库的访问权限。

  1. 创建用户:首先,使用 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';")
  1. 分配角色和权限:接着,根据用户的角色为他们分配适当的权限。例如,为数据分析师分配只读权限。
# 为用户分配 SELECT 权限
cursor.execute("GRANT SELECT ON database_name.* TO 'user1'@'localhost';")
conn.commit()

4.1.3 拓展案例

  1. 动态权限管理:在一个 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()
  1. 使用角色简化权限管理:为不同类型的用户(如管理员、编辑、访客)创建角色,并分配相应的权限集,然后将角色分配给用户。
# 创建角色并分配权限
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 应用,需要用户登录功能。

  1. 使用参数化查询验证用户登录
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 拓展案例

  1. 清理用户输入:在一个博客平台,用户可以提交评论。在处理这些输入之前,验证和清理数据是至关重要的。
# 假设有一个函数来清理用户输入
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 安全地存储到数据库
  1. 使用 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 进行数据库数据加密

假设你的应用需要存储用户的敏感信息,如社会安全号码。

  1. 应用层数据加密
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 拓展案例

  1. 加密数据库连接:在 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()
  1. 自动化数据库备份并加密备份文件:使用 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&#xff0c;使用v-for可以用来遍历数组和对象&#xff0c;具体如下&#xff1a; 注意&#xff1a;遍历数组或对象的时候&#xff0c;&#xff08;&#xff09;…...

CentOS 安装 redis 7.2

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

运维自动化bingo前端

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

Project2013下载安装教程,保姆级教程,附安装包和工具

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

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

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

Mac电脑如何通过终端隐藏应用程序?

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

linker list

linker list是利用lds 描述符实现同类型数据连续排布的一种机制。 下面是uboot里面的应用说明 lds文件里面需要增加section描述&#xff1a; . 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网络模型结构&#xff0c;并训练了20次2.2 以txt格式导出训练结果(模型的各个层权重偏置等参数)2.3 (可选)以pth格式导出训练结果&#xff0c;以方便后期调试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的数据可视化的智慧河南大屏&#xff0c;包含了GDP、…...

页面单跳转换率统计案例分析

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

眸思MouSi:“听见世界” — 用多模态大模型点亮盲人生活

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

电商小程序05用户注册

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

什么是UI设计?

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

React 实现表单组件

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

PlantUML绘制UML图教程

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

自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler

django-crontab 和 django-cron 有时候需要django在后台不断的执行一个任务&#xff0c;简单的可以通过中间件来实现&#xff0c;但是中间件是根据请求触发的。如果需要定时执行任务&#xff0c;则需要使用到一些插件。 django-crontab 和 django-cron 是常用的用于处理定时任…...

医院挂号预约|医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序目录 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &…...

网络选择流程分析(首选网络类型切换流程)

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

AutoSAR(基础入门篇)6.1-Vector的汽车电子开发工具链简介

目录 前言 一、PREEvision 二、vVIRTUALtarget 三、DaVinci 四、CANoe 五、CANape 其他 前言 因为国内用...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...