gpt4 book ai didi

MySql 允许使用条件字段但不允许读取

转载 作者:行者123 更新时间:2023-11-29 20:40:50 25 4
gpt4 key购买 nike

我想授予 MySql 用户使用 WHERE 条件中字段的权限,但不能读取它。例如:

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

-没关系,您可以在条件中使用secret_key!

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

-这是非法的,你甚至不需要读取secret_key!

很抱歉问了这个可能很愚蠢的问题,但在我看来,这就像第一种出现在人们脑海中的许可类型!

(抱歉,如果我的 MySql 语法不正确,我更喜欢保持高水平:))

最佳答案

据我所知,这不能通过 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

通过二分法,假设 secret 值包含在 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

使用 LIKE 的其他方法(也适用于字符串):

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)。

来自维基百科:

A cryptographic hash function is a mathematical algorithm that maps data of arbitrary size to a bit string of a fixed size (a hash function) which is designed to also be one-way function, that is, a function which is infeasible to invert. The only way to recreate the input data from an ideal cryptographic hash function's output is to try a large number of possible inputs to see if they produce a match.

例如,SHA1是MySQL中实现的哈希函数。

如果您授予访问 key 的哈希值而不是 key 本身的权限,则可以检查 SHA1(123) = Secret_key_hash 是否存在,但不允许获取 Secret_key值。

如果您的 Secret_key 是密码

  • 在开发系统之前学习良好实践
  • 您永远不应该以明文形式记录它(仅存储哈希值)
  • 像 SHA1、MD5 这样的快速哈希算法并不是为哈希密码而设计的,在这种情况下应避免使用。请考虑使用 BCRYPT 或提供的其他算法。如果您使用 PHP,此页面可能会很有趣:http://php.net/manual/en/faq.passwords.php

关于MySql 允许使用条件字段但不允许读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com