让用户安全地运行我们的MySQL数据库中的任意查询

时间:2018-10-30 04:41:50

标签: c++ mysql

我们为客户提供各种服务,例如发送电子邮件等。他们的用户保存在我们的数据库(MySQL)中。我们希望使我们的客户能够在不损害数据库的情况下对数据库进行任意搜索。让我详细说明:

下面是现有的表定义

 * User Table
   - email          varchar
   - category       integer

当前,我们的客户选择要为其执行操作(例如,发送电子邮件)的用户组的唯一方法是向我们发送类别。他们向我们发送类别,我们将对该类别中的所有用户采取措施。

但是,这是非常严格的限制,有时我们的客户希望以不受限制的方式运行自定义搜索。例如,下面是我们的新表

 * User Table
   - email          varchar
   - category       integer
   - gender         integer 
   - dob            integer 
   - country        varchar

,我们希望客户使用提及的所有字段(至少以逻辑AND,OR,%(like),()开始,例如

)对用户进行任意搜索
 (gender = 1 AND dob < 1999) OR category = 2. 

这个想法是让他们向我们传递一个子查询,该子查询将附加到WHERE子句中的“ SELECT”语句。但是,这样做存在风险,我们希望确保安全解决此问题,而不会因任何恶意尝试利用此功能而损害数据库。因此,我需要您的帮助/投入。

提供这种安全搜索用户能力的最安全方法是什么?我们在后端使用C ++。客户端使用REST API提供逻辑,该逻辑将由我们的C ++后端接收。

1 个答案:

答案 0 :(得分:0)

解决此问题的最佳方法可能是使用准备好的语句。出现困难是因为,以您的第二个User表为例,客户可能会请求一个查询,该查询的WHERE子句涉及该表中5列的任意组合。

一个可行的技巧是这样的:

SELECT *
FROM Users
WHERE
    email    = COALESCE(?, email)    AND
    category = COALESCE(?, category) AND
    gender   = COALESCE(?, gender)   AND
    age      = COALESCE(?, age)      AND
    country  = COALESCE(?, country);

基本思想是,您有一个准备好的语句,您始终将Users表中所有列的参数绑定到该语句。如果客户提出的请求不涉及某个列,则您绑定NULLWHERE子句中的条件将被有效忽略。

您使用的确切解决方案取决于您用来公开MySQL的编程语言。