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