【发布时间】:2017-08-03 12:59:55
【问题描述】:
我有一个脚本,它将查询作为字符串,然后附加查询以将数据库名称添加到任何列出的表中。目的是让我可以使用 Sequel Pro 运行一个大型查询,该查询将搜索服务器上的所有数据库,而无需在每个单独的数据库上运行查询或使用 sqldumps。到目前为止,它工作得很好......除了处理子查询时。
使用如下查询:
SELECT apple FROM basket
脚本将正确地附加它,以便它以
的形式出现SELECT apple FROM db_name.basket
但是,如果我尝试类似
SELECT apple FROM (SELECT fruit FROM basket) tmpTableA
它将名称附加到起始括号
SELECT apple FROM db_name.(SELECT fruit FROM db_name.basket) tmpTableA
但我需要它更像这样:
SELECT apple FROM (SELECT fruit FROM db_name.basket) tmpTableA
到目前为止,我还没有弄清楚如何识别和跳过紧跟在 FROM 语句之后的子查询,同时仍然附加在 FROM 语句之后的常规表之前。这是我脚本中的 sn-p:(dbList 是一个数组,其中包含服务器上每个数据库的名称)
for (count = 0; count < dbList.length; count++){
var dbName = "`" + dbList[count] + "`";
var rawSQL = userQuery + "<br>"; //userQuery pulls from the input and converts to lowercase
rawSQL = rawSQL.replace(/ from /ig, " from " + dbName + ".");
rawSQL = rawSQL.replace(/ join /ig, " join " + dbName + ".");
strSQL += rawSQL; //strSQL is later displayed on the page for the user
if (count < dbList.length - 1){
strSQL += "UNION<br>";
}
}
【问题讨论】:
-
在一般情况下,这需要相当于一个 SQL 解析器。
-
这不是对您的问题的回答,而是一个警告 - 这听起来像是 SQL 注入的一种非常迂回的形式 - 等待发生的攻击,因为大概是您将此查询发送到数据库。你能确保它是安全的吗?
-
它和我们一位已经可以访问数据库的内部员工一样安全。这是一个内部脚本,仅用于方便地获取我们提供的查询并生成一个大型查询,然后我们将其复制并粘贴到数据库的只读副本中。
标签: javascript mysql database