Mysql
如何使查詢保密?
我有一個項目,我需要對其活動保密,而且我不是伺服器管理員。
如果我的應用程序使用 id 更新使用者的值
1
,它可能會說類似的內容UPDATE 'users' SET 'Name' = 'George' WHERE 'Id' = 1;
,並且會顯示在 Apache 日誌中。我能做些什麼來避免這種情況?
Apache 日誌顯示 Apache Web 伺服器被要求執行的操作。
它通常對 SQL*知之甚少(也不關心)。*任何味道。
拜託,拜託,請告訴我您沒有通過 URL 和/或 QueryString 向您的 Web 應用程序送出原始 SQL 語句並執行它們!
強制性 XKCD 參考:小鮑比桌。
這是一個巨大的安全風險,如果 Apache 真的將查詢(包括個人數據)記錄到它自己的、基本上不安全的日誌文件中,那麼您將進入數據保護立法(例如 GDPR)方面的非常危險的水域。
將邏輯移動到伺服器端。
創建執行所需操作的儲存過程。然後從您的程式碼中呼叫此過程。例如:
-- on the server CREATE DEFINER = 'dbadmin@localhost' PROCEDURE update_user_name (userid BIGINT, newname VARCHAR(255)) SQL SECURITY DEFINER UPDATE users SET name = newname WHERE id = userid; -- on the client CALL update_user_name (1, 'George');
就這樣。Apache 日誌將僅顯示 CALL 語句。
主要改進:
- 客戶端無權查看 SP 文本 - 因此他無法看到此 SP 執行了什麼、更新了哪些表、在 SP 中實現了哪些附加檢查邏輯。
- 客戶端可能根本沒有訪問數據的權限——即使假設他猜測執行了什麼 SQL,嘗試執行
UPDATE
SP 中使用的查詢也會導致“您沒有訪問表的權限users
”。因為只有'dbadmin@localhost'
數據訪問權限,SP是使用這個賬號執行的,而查詢是使用使用者賬號執行的。- 如果您需要更改邏輯(例如,添加一些限製或改進),那麼您只需更改 SP 的文本,您不需要在所有客戶端工作站上更新客戶端軟體。