如何安全地连接到 MySQL 数据库

How to securely connect to MySQL database

我的 MySQL 数据库位于 Raspberry Pi 上。我是这样设置的:

sudo mariadb -u root -p

CREATE DATABASE Login;
CREATE USER RaspberryPi@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON Login.* TO RaspberryPi@'%';
SELECT Login;
CREATE TABLE Users;

我有这个 python 代码:

import mysql.connector
mydb = mysql.connector.connect(host="addr_of_pi", user="RaspberryPi", passwd="password", database="Login")
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM Users")
print(mycursor)

问题是,我想将此脚本作为 .exe 文件提供给某人,但我不想将我的数据库的帐户凭据提供给他。我尝试使用 PyProtect 但 .exe 脚本仍然可以通过某种方式读取。我也尝试过使用 os.gentenv(...) 但是你必须创建一个 .env 文件,其中包含也可以读取的凭据。那么还有其他方法吗?

您应该考虑将用户名和密码作为参数。

user = input()
password = input()

您可以使用 getpass 模块以获得更安全的方式

我认为没有任何简单安全的方法可以做到这一点。无论您做什么,只要将您的凭据保存到代码中或获取它们的方式(例如对网页的请求),人们就可以提取它们。查看 运行 您自己的服务器并学习如何创建 API.

使用 PHP 或 Django/python 将您的数据库凭据隐藏在网络服务器后面。与实际数据库的连接应该在那里进行,您的 .exe 应用程序应该连接到该服务器上的 API,该服务器负责为您从数据库中获取数据。我不知道您朋友的经验如何,或者该应用程序是否会被其他人进一步使用,但我强烈建议您花时间学习设置服务器和创建 APIs。

对于您的情况,请查看 运行 您 Raspberry Pi 上的 Django 服务器。 Python 应用程序会向处理数据库功能的 API 发出某种请求。

这样一来,您的数据库凭据和数据本身就是安全的,因为您的 API 只允许一组特定的操作,不会让任何人完全访问您的数据库。

免责声明:进入服务器需要相当长的时间,API秒,防止SQL注入等。保护您的数据库需要付出努力。

长话短说,您发布的任何内容都“可能”易碎。

在中间添加一个认证服务器将解决核心问题。他连接到你的服务器,你的服务器连接到...随便什么。

说来可悲,但基本上是您向用户发送的任何内容;只是假设它会被破解。你可以让它更难破解 blah blah,但在一天结束时,用户端安全(即只是在 exe 中拥有 db creds)基本上是无用的。您应该从字面上 - 永远不会 - 以这种方式在您的应用程序中公开凭据。

尝试存储过程

exe文件很容易被反编译。通常您可以在文本编辑器中打开文件并查看字符串,因此您的方法并不安全。

你应该改为:

  1. 创建执行 select:
  2. 的存储过程
    CREATE DEFINER=root@'%' PROCEDURE SelectUsers()
        READS SQL DATA
    BEGIN
      SELECT
        *
      FROM Users;
    END
  1. 只授予用户执行程序的权限。由于该过程是用 DEFINER=root@'%' 定义的,RaspberryPi 用户将代表 root 用户获取数据,因此无需授予对 table 本身的访问权限:
    GRANT EXECUTE ON PROCEDURE Login.SelectUsers TO 'RaspberryPi'@'%';
  1. 像这样分发你的剧本:
    import mysql.connector
    mydb = mysql.connector.connect(host="addr_of_pi", user="RaspberryPi", passwd="password", database="Login")
    mycursor = mydb.cursor()
    mycursor.execute("CALL SelectUsers()")
    print(mycursor)

使用这种方法,您的 RaspberryPi 用户将无法访问您数据库中的任何 table,它只能调用您授予执行权限的存储过程。因此,无需“执行”您的 Python 脚本。