2016-07-28 27 views
0

我想授予MySql用戶在WHERE條件中使用字段的權限,但不能讀取它。 例如: -MySql允許在條件中使用字段但不允許讀取

SELECT (example_field) FROM example_db.example_table WHERE secret_key = 123 

-Thats沒關係,你可以在條件中使用SECRET_KEY!

SELECT (example_field,secret_key) FROM example_db.example_table WHERE secret_key = 123 

-Thats非法的,你甚至都不需要閱讀SECRET_KEY的!

對不起,可能是愚蠢的問題,但在我看來,這似乎是第一種類型的權限彈出在你的腦海!

(很抱歉,如果我的MySQL語法不正確,我更喜歡住高層:))

回答

0

據我知道這不能通過標準的MySQL權限系統來完成。如果您可以在WHERE條件中使用字段,則可以讀取其值。這由SELECT權限(https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html)處理。

爲什麼這不是一個很好的解決方案

這是可以理解的:如果一個人在條件使用領域的能力,而不是直接選擇它,他終於可以猜測值,n步驟後:

通過蠻力:

SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value = 1; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value = 2; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value = 3; -- 0 
-- ... 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value = 123; -- 1 ! FOUND 

通過二分法,假定祕密值被包含在0和1000之間,例如:

SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 500; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 250; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 125; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 75; -- 1 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 112; -- 1 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value >= 118; -- 1 
-- ... you get it 

使用像其他的方法(也可以爲字符串工作):

SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value LIKE '1%'; -- 1 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value LIKE '11%'; -- 0 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value LIKE '12%'; -- 1 
SELECT COUNT(*) FROM yourtable WHERE id = 321 AND secret_value LIKE '121%'; -- 0 
-- ... 

因此,我們可以說,一定數量的步驟之後,用做條件的能力,我們反正可以得到的價值。

你能做什麼

你可以定義將包含您SECRET_KEY的哈希場(假設secret_key_hash)。

維基百科:

密碼散列函數是被設計爲還是一維的數學算法任意大小的 數據映射爲固定大小(散列函數 )的比特串也就是說,一個 函數是不可能反轉的。通過理想的加密散列函數的輸出重新創建 輸入數據的唯一方法是嘗試大量可能的輸入以查看它們是否產生匹配。

例如,SHA1是在MySQL中實現的哈希函數。

如果您允許訪問密鑰的散列而不是密鑰本身,它可以檢查是否SHA1(123) = secret_key_hash但它不允許獲取s​​ecret_key值。

如果您SECRET_KEY是密碼

  • 瞭解開發系統
  • 之前的良好做法你不應該記錄它以明文(只存儲散列)
  • 快速的散列算法,如SHA1, MD5 ...不是用來散列密碼的,在這種情況下應該避免使用。請考慮使用BCRYPT或其他算法。如果你使用PHP,這個頁面可能很有趣:http://php.net/manual/en/faq.passwords.php
+0

謝謝你的詳細的答案和建議!我會考慮使用散列算法(幸運的是,我沒有處理任何個人信息。)它仍然覺得它會讓它更安全。 – kissgergely

相關問題