Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别javascript字符串中的子查询_Javascript_Mysql_Database - Fatal编程技术网

识别javascript字符串中的子查询

识别javascript字符串中的子查询,javascript,mysql,database,Javascript,Mysql,Database,我有一个脚本,它将一个查询作为字符串,然后附加查询以将数据库名称添加到任何列出的表中。这样我就可以使用Sequel Pro运行一个大型查询,搜索服务器上的所有数据库,而无需在每个数据库上运行查询或处理SQLDump。到目前为止,它工作得很好…除了处理子查询 使用查询,例如: SELECT apple FROM basket 脚本将正确地附加它,使其显示为 SELECT apple FROM db_name.basket 然而,如果我尝试像 SELECT apple FROM (SELECT

我有一个脚本,它将一个查询作为字符串,然后附加查询以将数据库名称添加到任何列出的表中。这样我就可以使用Sequel Pro运行一个大型查询,搜索服务器上的所有数据库,而无需在每个数据库上运行查询或处理SQLDump。到目前为止,它工作得很好…除了处理子查询

使用查询,例如:

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语句后面的常规表前面追加。下面是我脚本中的片段: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>";
  }
}

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

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

可以修改它来处理其他类型的查询,也可以只使用多个正则表达式模式

设q=从篮子中选择水果中选择苹果 让newQ=q.replace/FROM\s+[^\\]/gi,FROM db_name.$1;
console.lognewQ 这可能是个坏主意,所以要小心

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

可以修改它来处理其他类型的查询,也可以只使用多个正则表达式模式

设q=从篮子中选择水果中选择苹果 让newQ=q.replace/FROM\s+[^\\]/gi,FROM db_name.$1;
console.lognewQ;在一般情况下,这需要相当于一个SQL解析器。这并不是对您的问题的回答,而是一个警告-这听起来像是一种真正迂回的SQL注入形式-一种等待发生的攻击,因为您可能正在将此查询发送到数据库。你能保证它的安全吗?它和我们的一名内部员工一样安全,他们已经可以访问数据库了。这是一个内部脚本,它只是为了方便地接受一个查询,我们将其输入并生成一个大型查询,然后将其复制并粘贴到数据库的只读副本中。在一般情况下,这需要一个SQL解析器。这与其说是一个警告,不如说是对您的问题的回答——这听起来像是一个真正的迂回SQL注入的形式—一种等待发生的攻击,可能是因为您正在将此查询发送到数据库。你能保证它的安全吗?它和我们的一名内部员工一样安全,他们已经可以访问数据库了。这是一个内部脚本,用于方便地获取一个查询,我们将其输入并生成一个大型查询,然后将其复制并粘贴到数据库的只读副本中。这可能是个坏主意,所以请小心。->是的。OP的评论似乎表明他们知道自己在做什么,并且他们正在承担风险。不知道为什么这个答案被否决了。谢谢,这就解决了问题。是的,我知道这是个坏主意,但我们讨论的是一个在本地运行的脚本,它不直接涉及任何数据库或外部网站。它基本上只是一个工具,用来简化内部团队的工作。谢谢你的帮助,@KhauriMcClain!这可能是个坏主意,所以要小心。->是的。OP的评论似乎表明他们知道自己在做什么,并且他们正在承担风险。不知道为什么这个答案被否决了。谢谢,这就解决了问题。是的,我知道这是个坏主意,但我们讨论的是一个在本地运行的脚本,它不直接涉及任何数据库或外部网站。它基本上只是一个工具,用来简化内部团队的工作。谢谢你的帮助,@KhauriMcClain!