是否RedQueryBuilder api,它允许访问查询树,而不是完成sql? 我想写安全的方式来接收来自客户端的SQL请求,在服务器上形成最终的SQL。 例如,客户端可以发送:
{
op: "AND",
left: {
op: "=",
left: "name",
right: "Bob"
},
right: {
op: "<",
left: "time",
right: "1300000000" // now() timestamp
}
}
答案 0 :(得分:1)
最后,我使用客户端的SQL解析器来构造条件树并像json一样发送到服务器。
我简化的管理界面: https://gist.github.com/Somewater/5705567
in a nutshell: 1) ReQueryBulder generate SQL request (string) 2) SQL Parser create SQL request structure 3) My code convert SQL Parser structure to simple json (as stated above) 4) send json to the server
服务器请求解析器(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
答案 1 :(得分:0)
我担心不会。
在您的示例中,如果“now()”是一个SQL片段,您仍会遇到安全问题吗?
我建议你看看你的数据库给你什么选项完全不信任SQL。例如。功耗非常低的用户,只能根据视图进行选择
或者你重新解析SQL来检查它的内容(这似乎是一个穷人使用你的数据库约束SQL的版本。)
也许将SQL添加为标签?关于允许不受信任的SQL命中数据库可能会有一些宗教争论。
进一步担心的是防止DOS,因此数据库也可能最适合进行资源限制。例如客户端(以任何格式)发送可怕的笛卡尔联接。