我正在研究一种方法来获取基于SQL查询的所有值,然后在php中进行scape。
这个想法是让那些在进行SQL查询时对安全性粗心的程序员。
所以当我尝试执行此操作时:
INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)
正则表达式需要捕获'a' 'b' 'c' a
和b
我正在研究这几天。
这是我可以获得的2个正则表达式查询,但我想知道是否有更好的方法:
VALUES ?\((([\w'"]+).+?)\)
基于之前的SQL,它将匹配:
VALUES ('a','b','c',a,b)
第二个正则表达式
['"]?(\w)['"]?
将匹配
a b c a b
以前删除VALUES
。
这种方式会匹配我要插入的很多值。
但是不适用于JSON。
{a:b, "asd":"ads" ....}
对此有何帮助?
答案 0 :(得分:0)
首先,我认为你应该知道SQL支持多种类型的单/双引号字符串:
'Northwind\'s category name'
'Northwind''s category name'
"Northwind \"category\" name"
"Northwind ""category"" name"
"Northwind category's name"
'Northwind "category" name'
'Northwind \\ category name'
'Northwind \ncategory \nname'
要匹配它们,尝试使用这些模式:
"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"
'[^\\']*(?:(?:\\.|'')[^\\']*)*'
将模式组合在一起:
VALUES\s*\(\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+))*\)
PHP5.4.5示例代码:
<?php
$pat = '/\bVALUES\s*\((\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+))*)\)/';
$sql_sample1 = "INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)";
if( preg_match($pat, $sql_sample1, $matches) > 0){
printf("%s\n", $matches[0]);
printf("%s\n\n", $matches[1]);
}
$sql_sample2 = 'INSERT INTO tabla (a, b,c,d) VALUES (\'a\',\'{a:b, "asd":"ads"}\',\'c\',a,b)';
if( preg_match($pat, $sql_sample2, $matches) > 0){
printf("%s\n", $matches[0]);
printf("%s\n", $matches[1]);
}
?>
输出:
VALUES ('a','b','c',a,b)
'a','b','c',a,b
VALUES ('a','{a:b, "asd":"ads"}','c',a,b)
'a','{a:b, "asd":"ads"}','c',a,b
如果您需要从结果中获取每个值,请按,
分割(如解析CSV)
我希望这会对你有所帮助:)。