我在 Raspberry Pi 上有我的 MySQL 資料庫。我是這樣設定的:
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 檔案。那么還有其他方法嗎?
uj5u.com熱心網友回復:
嘗試存盤程序。
exe檔案很容易被反編譯。通常,您可以在文本編輯器中打開檔案并查看字串,因此您的方法并不安全。
你應該:
- 創建一個執行選擇的存盤程序:
CREATE DEFINER=root@'%' PROCEDURE SelectUsers()
READS SQL DATA
BEGIN
SELECT
*
FROM Users;
END
- 僅授予用戶執行該程序的權限。由于該程序是用
DEFINER=root@'%'樹莓派用戶定義的,將代表root用戶獲取資料,因此不需要授予對表本身的訪問權限:
GRANT EXECUTE ON PROCEDURE Login.SelectUsers TO 'RaspberryPi'@'%';
- 像這樣分發你的腳本:
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 用戶將無法訪問您資料庫中的任何表,它只能呼叫您授予執行權限的存盤程序。因此,無需“執行”您的 Python 腳本。
uj5u.com熱心網友回復:
長話短說,您發布的任何內容都“可能”易碎。
在中間添加一個身份驗證服務器將解決核心問題。他連接到你的服務器,你的服務器連接到......隨便。
廢話,但基本上是你發送給用戶的任何東西;只是假設它會被破解。你可以讓它更難破解等等,但歸根結底,用戶端的安全性(即只在 exe 中擁有 db creds)基本上是無用的。你應該從字面上——永遠——在你的應用程式中公開憑據。
uj5u.com熱心網友回復:
您應該考慮將用戶名和密碼作為引數。
user = input()
password = input()
uj5u.com熱心網友回復:
我認為沒有任何簡單安全的方法可以做到這一點。無論您做什么,只要您的憑據保存在代碼中或獲取它們的方式(例如對網頁的請求),人們都可以提取它們。研究運行您自己的服務器并學習如何創建 API。
使用 PHP 或Django/python將您的資料庫憑據隱藏在網路服務器后面。與實際資料庫的連接應該發生在那里,您的 .exe 應用程式應該連接到該服務器上的 API,該 API 為您處理從資料庫中獲取資料。我不知道您朋友的經驗如何,也不知道該應用程式是否會被其他人進一步使用,但我強烈建議您花時間學習設定服務器和創建 API。
在您的情況下,考慮在您的 Raspberry Pi 上運行 Django 服務器。Python 應用程式會向處理資料庫功能的 API 發出某種請求。
這樣,您的資料庫憑據和資料本身將是安全的,因為您的 API 將只允許一組特定的操作,并且不會授予任何人對您的資料庫的完全訪問權限。
免責宣告:進入服務器、API、防止 SQL 注入等需要相當長的時間。保護資料庫需要付出努力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/400243.html
上一篇:如何在aspnetcorewebAPI上正確地將串列轉換為IQueryable
下一篇:如何獲得每組的第一行?
