《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

news2024/9/22 1:02:36

在这里插入图片描述

文章目录

  • 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.connector

conn = 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 Error

def check_login(username, password):
    try:
        conn = mysql.connector.connect(host='localhost', database='mydb', user='user', password='pass')
        cursor = conn.cursor(prepared=True)  # 使用 prepared statement
        query = "SELECT * FROM users WHERE username = %s AND password = %s"
        cursor.execute(query, (username, password))  # 参数化查询
        result = cursor.fetchone()
        return result is not None
    except 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.connector

conn = 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 应用中实施这些策略,不仅可以增强数据安全,还能提高用户对应用的信任度。正确的密钥管理和备份策略也是确保数据安全的关键部分,应该得到充分的关注和实施。

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

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

相关文章

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

了解海外云手机的多种功能

随着社会的高度发展,海外云手机成为商家不可或缺的工具,为企业出海提供了便利的解决方案。然而,谈及海外云手机,很多人仍不了解其强大功能。究竟海外云手机有哪些功能,可以为我们做些什么呢? 由于国内电商竞…

ubuntu22.04 安装部署05:禁用默认显卡驱动

一、相关文章 ubuntu22.04安装部署03: 设置root密码-CSDN博客 《ubuntu22.04装部署01:禁用内核更新》 《ubuntu22.04装部署02:禁用显卡更新》 二、场景说明 Ubuntu22.04 默认显卡驱动,如果安装cuda,需要单独安装显…

Javaweb之SpringBootWeb案例之异常处理功能的详细解析

3. 异常处理 3.1 当前问题 登录功能和登录校验功能我们都实现了,下面我们学习下今天最后一块技术点:异常处理。首先我们先来看一下系统出现异常之后会发生什么现象,再来介绍异常处理的方案。 我们打开浏览器,访问系统中的新增部…

【开源项目阅读】Java爬虫抓取豆瓣图书信息

原项目链接 Java爬虫抓取豆瓣图书信息 本地运行 运行过程 另建项目,把四个源代码文件拷贝到自己的包下面 在代码爆红处按ALTENTER自动导入maven依赖 直接运行Main.main方法,启动项目 运行结果 在本地磁盘上生成三个xml文件 其中的内容即位爬取…

MPLS VPN功能组件(3)

私网标签分配 通过MPBGP为VPNv4路由分配内层标签 PE从CE接收到IPv4路由后,对该路由加上相应VRF的RD(RD手动配置),使其成为一条VPNV4路由,然后在路由通告中更改下一跳属性为自己,通常是自己的Loopback地址…

【Linux】进程学习(二):进程状态

目录 1.进程状态1.1 阻塞1.2 挂起 2. 进程状态2.1 运行状态-R进一步理解运行状态 2.2 睡眠状态-S2.3 休眠状态-D2.4 暂停状态-T2.5 僵尸状态-Z僵尸进程的危害 2.6 死亡状态-X2.7 孤儿进程 1.进程状态 1.1 阻塞 阻塞:进程因为等待某种条件就绪,而导致的…

Linux操作系统基础(四):Linux连接工具使用

文章目录 Linux连接工具使用 一、为什么要使用远程连接工具 二、虚拟机网络配置 三、获取Linux操作系统IP地址 四、聊一聊Linux系统账号 五、安装finalshell远程连接软件 六、建立连接 七、软件界面与使用说明 Linux连接工具使用 一、为什么要使用远程连接工具 因为一…

USMART是什么?

一、USMART简介 USMART是一个串口调试组件,可以大大提高代码调试效率,为正点原子为STM32开发的类似linux中shell的调试工具。 一般开发者正常情况下,对单片机功能进行调试的过程大致为:下载——调试——修改——下载——调试——…

解决MapboxGL的Popup不支持HTMLDiv元素的问题

解决MapboxGL的Popup不支持HTMLDiv元素的问题 官网给出的文档是不支持HTMLDivElement的,只支持HTML标签。 如果单纯的只显示字符串,那就没问题,如果想在Popup中使用更强大的功能,此时就不行了,下面是源码的一部分显示…

[VulnHub靶机渗透] Sar: 1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点,其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性,而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系,导…

[CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理

文章目录 前言一、所需环境二、实现思路2.1. 定义了LeNet网络模型结构,并训练了20次2.2 以txt格式导出训练结果(模型的各个层权重偏置等参数)2.3 (可选)以pth格式导出训练结果,以方便后期调试2.4 C CUDA要做的事 三、C CUDA具体实现3.1 新建.cu文件并填好…

nvm安装nodejs 报错certificate has expired or is not yet valid

今天在使用nvm安装nodejs时,突然报如下错误: 从报错信息中很容易知道这是因为镜像凭证过期,所以我们只需要换个镜像即可。 打开你nvm的安装目录下的settings.txt文件,将下面两行添加到里面,如果已经有的就覆盖。 nod…

LeetCode Python - 4. 寻找两个正序数组的中位数

文章目录 题目答案运行结果 题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2…

Flink CDC 与 Kafka 集成:Snapshot 还是 Changelog?Upsert Kafka 还是 Kafka?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

【精选】java初识多态 子类继承父类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

使用 Docker 镜像预热提升容器启动效率详解

概要 在容器化部署中,Docker 镜像的加载速度直接影响到服务的启动时间和扩展效率。本文将深入探讨 Docker 镜像预热的概念、必要性以及实现方法。通过详细的操作示例和实践建议,读者将了解如何有效地实现镜像预热,以加快容器启动速度,提高服务的响应能力。 Docker 镜像预热…

【Python】使用 requirements.txt 与 pytorch 相关配置

【Python】使用 requirements.txt 与 pytorch 相关配置 前言一、pip1、导出结果含有路径2、导出不带路径的 二、Conda1、导出requirements.txt2、导出yml 文件 三、第三方包:pipreqs(推荐)1、创建并激活conda环境2、安装requirements文件的pi…

DevOps:CI、CD、CB、CT、CD

目录 一、软件开发流程演化快速回顾 (一)瀑布模型 (二)原型模型 (三)螺旋模型 (四)增量模型 (五)敏捷开发 (六)DevOps 二、走…