【问题标题】:Recognizing a subquery in a javascript string识别 javascript 字符串中的子查询
【发布时间】: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


【解决方案1】:

这可能是个坏主意,所以要小心。

在下面的代码中,我使用了String#replace 和一个正则表达式。
正则表达式查找FROM,后跟一个或多个空格字符,后跟一个不是() 的字符,并将该字符保存在捕获组中。然后它将整个匹配替换为FROM db_name.$1,其中$1 是捕获组中捕获的文本。

这可以修改为处理其他类型的查询,或者您可以只使用多个正则表达式模式。

let q = "SELECT apple FROM (SELECT fruit FROM basket) tmpTableA"

let newQ = q.replace(/FROM\s+([^\(\)])/gi, "FROM db_name.$1");

console.log(newQ);

【讨论】:

  • “这可能是个坏主意,所以要小心。” -> 是的,确实如此。
  • OP 的 cmets 似乎暗示他们知道自己在做什么。并且他们正在承担风险。不知道为什么这个答案被否决了。
  • 谢谢,问题解决了。是的,我知道这是一个坏主意,但我们谈论的是在本地运行且不直接接触任何东西(包括数据库或外部网站)的脚本。它基本上只是一个组合在一起的工具,使内部团队的工作变得更容易。感谢您的帮助,@KhauriMcClain!
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多