mysql-restrict查询的select子句中允许的计算

mbskvtky  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(298)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

两年前关门了。
改进这个问题
在mysql(5.6版)中,我可以在我的 SELECT 条款。
例如

SELECT (a*2) as x, (b+2) as y, sum(...) from table_name;

我还可以动态地传递计算。问题是我能通过任何公式。有没有办法限制我可以放什么 SELECT 条款?这可能在注入攻击中被利用。
编辑:我可以把如下内容:

SELECT @@version, @@hostname, (a*2) as x, (b+2) as y, sum(...) from table_name;

这将暴露我的数据库版本和主机名。

vwkv1x7d

vwkv1x7d1#

最接近你可能想到的是一种叫做“准备好的陈述”的东西。语句可以防止恶意用户通过sql查询中的文本值注入sql。但是,语句不允许列本身成为参数。
在这里,我能想到的唯一安全的方法是选择列,所有这些列的值在用户定义的公式中都是必需的。然后,将这些列/变量返回到app层,并在那里计算公式。如果您试图用用户的输入(例如从ui)在sql中构建公式,那么您就有被注入的风险。

b1uwtaje

b1uwtaje2#

你的http Package 听起来像是设计上的漏洞。
如果允许不受信任的输入作为sql查询的一部分执行,这就是sql注入的定义。
防止sql注入的常见建议是使用查询参数。如果查询的动态部分相当于一个常量值(如带引号的字符串值、日期或数字文字),但它不适用于查询中可能需要的其他内容,如列名或表达式,则这是非常好的。
@timbiegeleisen所描述的有时被称为白名单。
在白名单方法中,用户不能发送文本表达式。它们选择sql表达式,但只能从应用程序中控制的一组预定义表达式中进行选择。
这是sql注入:

http://example.com/query?expr=(a*2) as x

这是白名单:

http://example.com/query?expr=1

其中“1”是硬编码的,用于选择已批准表达式集中的第一个表达式。你需要一个 case 语句或数组之类的。
这是一个白名单,因为如果用户试图发送一个expr id,它与您的 case 语句或表达式数组,则应用程序将不执行任何操作,或返回错误消息。

http://example.com/query?expr=(select password from users)

可能返回:

HTTP Status 400 Bad Request

这需要你有一些更强大的应用层。必须编写代码才能将表达式idMap到完整表达式。

相关问题