我让我的用户在我正在构建的应用程序中执行sql查询。他们可以输入数据库连接字符串(支持mysq,pg和其他rdbms) 有没有办法只在像这样的提取方法上允许SELECT语句
client = Sequel.connect "mysql2://user:pass@hostname/some_db"
client.fetch("SELECT * FROM sample_table").all
并禁止以下
client.fetch("DROP DATABASE some_db").all
client.fetch("TRUNCATE some_table").all
client.fetch("ALTER some_table").all
我可以使用续集gem获取每个表列的表和数据类型吗?
答案 0 :(得分:0)
这听起来像是危险的事情。针对所有情况很难对输入进行适当的清理。 只需考虑过程,动态创建SQL,连接语句,PLSQL,up / downcase,SQL变体,清理程序中的错误,......
你永远不应低估恶意用户的创造力。
最好是在数据库级别处理此问题,并创建具有适当访问权限的只读用户。