《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.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.mfbz.cn/a/380003.html

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

相关文章

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度:中等 分类:二叉树 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨…

CUDA简介

CPUGPU异构计算 GPU计算并不是指单独的GPU计算,而是指CPUGPU的异构计算。一块单独的GPU是无法独立的完成所有计算任务的,它必须在CPU的调度下才能完成特定的任务。CPU更适合进行逻辑复杂低并行的程序,GPU更适合逻辑简单高并行的任务。这主要…

问题:必须坚持以中国式现代化推进中华民族伟大复兴,既不走封闭僵化的老路,也不走 #媒体#知识分享

问题:必须坚持以中国式现代化推进中华民族伟大复兴,既不走封闭僵化的老路,也不走 A、中国特色社会主义道路 B、改革开放之路 C、改旗易帜的邪路 D、中国式现代化之路 参考答案如图所示

HarmonyOS 鸿蒙 ArkTS 双色旋转动画效果

下载地址: https://download.csdn.net/download/weixin_54226053/88818859 也可以点击顶部的资源下载

【Git】Windows下通过Docker安装GitLab

私有仓库 前言基本思路拉取镜像创建挂载目录创建容器容器启动成功登录仓库设置中文更改密码人员审核配置邮箱 前言 由于某云存在人数限制,这个其实很好理解,毕竟使用的是云服务器,人家也是要交钱的。把代码完全放在别人的服务器上面&#xf…

Qt网络编程-ZMQ的使用

不同主机或者相同主机中不同进程之间可以借助网络通信相互进行数据交互,网络通信实现了进程之间的通信。比如两个进程之间需要借助UDP进行单播通信,则双方需要知道对方的IP和端口,假设两者不在同一主机中,如下示意图: …

C#,十进制展开数(Decimal Expansion Number)的算法与源代码

1 十进制展开数 十进制展开数(Decimal Expansion Number)的计算公式: DEN n^3 - n - 1 The decimal expansion of a number is its representation in base -10 (i.e., in the decimal system). In this system, each "decimal place…

戴上HUAWEI WATCH GT 4,解锁龙年新玩法

春节将至,华为WATCH GT 4作为一款颜值和实力并存的手表,能为节日增添了不少趣味和便利。无论你是钟情于龙年表盘或定制属于自己的表盘,还是过年用来抢红包或远程操控手机拍全家福等等,它都能成为你的“玩伴”。接下来,…

C++后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee

C后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee 为了记录学习的过程,学习Sylar时写的代码统一提交到Gitee仓库中。 Ubuntu配置Gitee 安装git sudo apt-get install -y git配置用户名和邮箱 git config --global user.name 用户名 …

产品效果图为何要用渲染100农场?渲染100邀请码1a12

产品效果图很重要,它能帮助设计人员和消费者理解产品特点,是不可或缺的一步。产品效果图渲染耗时耗力,不仅慢而且容易出错,在这种情况下,使用渲染农场就成了必备选择,以目前国内最好的渲染农场渲染100为例&…

【芯片设计- RTL 数字逻辑设计入门 番外篇 9 -- SOC 中PL端与PS端详细介绍】

文章目录 Programmable Logic and Processing SystemPL(Programmable Logic)特点PS和PL之间的协同设计和开发工具 Programmable Logic and Processing System 在系统级芯片(SoC)的上下文中,“PL” 通常指的是可编程逻…

JavaScript基础第六天

JavaScript 基础第六天 今天我们学习数组的遍历&#xff0c;以及数组的其他用法。 1. 数组遍历 1.1. 古老方法 可以使用 for 循环进行遍历。 let arr ["a", "b", "d", "g"]; for (let i 0; i < arr.length; i) {console.log…

HiveSQL——用户中两人一定认识的组合数

注&#xff1a;参考文章&#xff1a; SQL之用户中两人一定认识的组合数--HQL面试题36【快手数仓面试题】_sql面试题-快手-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞3次&#xff0c;收藏12次。目录0 需求分析1 数据准备2 数据分析3 小结0 需求分析设表名&#xff1a;table0现…

Jupyter Notebook如何在E盘打开

Jupyter Notebook如何在E盘打开 方法1&#xff1a;方法2&#xff1a; 首先打开Anaconda Powershell Prompt, 可以看到默认是C盘。 可以对应着自己的界面输入&#xff1a; 方法1&#xff1a; (base) PS C:\Users\bella> E: (base) PS E:\> jupyter notebook方法2&#x…

分析 丨ToF传感器的XR应用和主要厂商

苹果MR头显Vision Pro被业界关注&#xff0c;另有消息称华为在2024年规划2款产品&#xff0c;一个是与Vision Pro、Quest和PICO方案类似的MR头显&#xff0c;预计2024年Q3或者Q4发布&#xff1b;另一个是与魅族MYVU衍射光波导AR眼镜类似的产品&#xff0c;发布时间晚于MR头显。…

数码管扫描显示-单片机通用模板

数码管扫描显示-单片机通用模板 一、数码管扫描的原理二、display.c的实现1、void Display(void) 各模式界面定义数据2、void BackupRamToDisRam(void)从缓存区刷新显示映射Ram3、void FreshDisplay(void) 映射显示Ram到主控的IO口4、void LcdDisplay_8bit(void) 映射显示Ram到…

[leetcode] 32. 最长有效括号

文章目录 题目描述解题方法方法一&#xff1a;栈java代码复杂度分析 方法二&#xff1a;贪心java代码复杂度分析 相似题目 题目描述 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输…

[Java][算法 哈希]Day 01---LeetCode 热题 100---01~03

LeetCode 热题 100---01~03 ------->哈希 第一题 两数之和 思路 最直接的理解就是 找出两个数的和等于目标数 这两个数可以相同 但是不能是同一个数字&#xff08;从数组上理解就是内存上不是同一位置&#xff09; 解法一&#xff1a;暴力法 暴力解万物 按照需求 …

spring-security authentication persistence

翻译版本【spring-security 6.2.1】persistence Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示输入凭据的最常见方法之一是将用户重定向到登录页面。未经身份验证的用户请求受保护的资源的HTTP交换可能如下所示: 例1。未…

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…
最新文章