php preg_match_all查找空匹配项

php preg_match_all查找空匹配项,php,regex,Php,Regex,在网上搜索了几个小时后,我发现了一个我不理解的错误。 我使用POST方法通过ajax查询发出了一个SQL请求,并为我的网站的不同页面生成了该请求,有时甚至需要用户直接输入 为了避免SQL注入,我想检查参数的内容。 我不能使用PDO::quote(),因为某些参数可以包含列表或SQL函数:例如:select参数可以包含c.id\u客户端、c.nom、COUNT(c.id\u客户端)…。 为了防止SQL注入,我用preg_match_all()将一些SQL关键字和函数列入黑名单 在我正在测试的情况下

在网上搜索了几个小时后,我发现了一个我不理解的错误。 我使用
POST
方法通过ajax查询发出了一个SQL请求,并为我的网站的不同页面生成了该请求,有时甚至需要用户直接输入

为了避免SQL注入,我想检查参数的内容。 我不能使用PDO::quote(),因为某些参数可以包含列表或SQL函数:例如:
select
参数可以包含
c.id\u客户端、c.nom、COUNT(c.id\u客户端)…。

为了防止SQL注入,我用
preg_match_all()将一些SQL关键字和函数列入黑名单

在我正在测试的情况下,
$inputs
是json_编码的post数组:

{"select":"c.id_client, c.prenom, c.nom, c.email, COUNT(t.actif) AS nombre_licences","from":"clients","as":"c","inner":{"1":{"cond":{"1":{"join_in":"cl.id_client","join_out":"c.id_client"}},"table":"clients_licences","as":"cl"},"2":{"cond":{"1":{"join_in":"t.id_client_licence","join_out":"cl.id_client_licence"},"2":{"join_in":"t.actif","join_out":"1"}},"table":"terminaux","as":"t"}},"where":{"1":{"index":"CONCAT_WS('', c.prenom, c.nom, c.email, c.siren)","operand":"LIKE","value":"%necas%"}},"group":{"1":{"index":"c.id_client"}},"order":{"1":{"index":"c.nom"},"2":{"index":"c.id_client"}},"offset":"0","limit":"3","resultFormat":"<tr class=\"result\"><td>$$id_client##<\/td><td>$$nom## $$prenom##<\/td><td>$$email##<\/td><td>$$nombre_licences##<\/td><td><button class=\"btn btn-xs btn-success\" onclick=\"location.href='\/admin\/view\/$$id_client##'\" ><i class=\"fa fa-search\" aria-hidden=\"true\"><\/i> Voir<\/button><\/td><\/tr>"}
我在不同的正则表达式测试仪上测试了几次,就像没有得到任何匹配

请注意,我不能修改这个代码太多

谢谢你的帮助,Jm56Z

_

编辑:

似乎preg_match_all()将
$matches
设置为包含两倍匹配数组的数组:

$matches = [[matches], [matches]]

似乎正则表达式本身是错误的。对于给定的JSON示例,请尝试:

"(add|alter|create|delete|drop|exec|insert|set|table|truncate|update|view)[\w% ]*":
解决方案:

preg\u match\u all()
将所有匹配项放入多维数组中,即使它找不到任何匹配项。 默认情况下:

[[matches of the full regex], [matches of group 1], [matches of group 2]...]
下次我将更加仔细地阅读文档。

这是关于
PHP警告:preg\u match\u all()希望参数2是字符串,数组给定…
可能?您是如何获得
$inputs
?这是由客户端查询生成器准备的文本AJAX请求吗?或者您使用了PHP中的SQL查询解析器来实现这一点?如果是这样的话,那么基本的regex命令黑名单就没有多大意义了,如果你已经将所有内容分解为
“select”:
。我对我的ajax使用post方法。这个验证是我对输入做的第一件事。我首先在post数组上使用
json\u encode()
。我只在值上列出sql关键字(因为索引是“select”、“from”等…),恐怕您的应用程序设计非常难以保护,如果不是不可能的话。如果您有一个向服务器提交随机SQL代码的工具,那么您可以实现的唯一严重的安全性就是通过限制MySQL用户的权限而不是运行代码来实现的。这就像把你家的钥匙交给某个陌生人:检查他是否有违禁物品清单是毫无用处的;最多,您可以锁定一些房间。Alvaro您是对的,这就是为什么主sql调用是
SELECT
,无法修改,然后我阻止使用嵌套sql调用。我尽我所能减少网站中的代码量(已经很大了),我不得不说我同意@lvaroGonzález,你描述的设计真的很糟糕。我可以理解您正在尝试做的事情,但即使忽略可能存在的直接sql安全问题,在API中允许这种灵活性的应用程序体系结构也非常糟糕。在本地编写查询,并使用调用它们的API端点。如果您真的需要外部应用程序能够将自己的查询写入该级别,那么他们可能应该能够实际访问数据库,因为您的PHP系统可能只会成为性能瓶颈。这还会找到索引:
$matches=[[“表”、“表”、“集”、“视图”]、[“表”、“表”、“集”,“查看”]
并始终返回true。我只想测试这些值,这就是为什么我在正则表达式的末尾有
“[^:]
"(add|alter|create|delete|drop|exec|insert|set|table|truncate|update|view)[\w% ]*":
[[matches of the full regex], [matches of group 1], [matches of group 2]...]