2

RedQueryBuilder api允许访问查询树,而不是完成的sql吗我想编写安全的方式来接收来自客户端的 SQL 请求,在服务器上形成最终的 SQL。例如,客户端可能会发送:

{
    op: "AND",
    left: {
        op: "=",
        left: "name",
        right: "Bob"
    },
    right: {
        op: "<",
        left: "time",
        right: "1300000000" // now() timestamp
    }
} 
4

2 回答 2

1

最后,我在客户端使用 SQL 解析器构建条件树,并像 json 一样发送到服务器。

它是我的简化管理界面: https ://gist.github.com/Somewater/5705567

简而言之:
1) ReQueryBulder 生成 SQL 请求(字符串)
2) SQL Parser 创建 SQL 请求结构
3)我的代码将 SQL Parser 结构转换为简单的 json(如上所述)
4)发送json到服务器

和服务器请求解析器(ruby): https ://gist.github.com/Somewater/5705620

我可以像这样处理服务器上的请求(在我的例子中是 Rails 请求控制器):

include ConditionsBuilder
cond = JSON.parse(request.params['cond']) # conditions like json string
condTree = self.parse_sql_conditions_from_json(cond) # conditions like btree structure

# perform some conditions checks, for example, add additional conditions
permission_conds = And[ GtEq['permissions', 12], Eq['is_admin', 1] ]
condTree = And[condTree, permission_conds]


conditions = self.build_sql_conditions((Time.new - 90.days).to_i, Time.new.to_i, condTree)
# handle sql request: "SELECT * FROM tablename WHERE " + conditions.to_s
于 2013-06-04T12:56:11.357 回答
0

恐怕它没有。

在您的示例中,如果“now()”是一个 SQL 片段,您仍然会遇到安全问题吗?

我建议您看看您的数据库为您提供了哪些选项来完全不信任 SQL。例如,非常低功率的用户,只选择视图

或者您重新解析 SQL 以检查其内容(这似乎是使用数据库来约束 SQL 的穷人版本)。

也许将 SQL 添加为标签?关于允许不受信任的 SQL 访问您的数据库可能是一场宗教战争。

另一个担心是防止 DOS,因此数据库也可能最适合进行资源限制。例如,客户端发送(以任何格式)一个可怕的笛卡尔连接。

于 2013-06-03T10:25:38.690 回答