正则表达式:SQL-Query-String匹配*或。*但是count(*)

时间:2017-03-23 23:40:06

标签: php mysql regex

有一个像这样的查询字符串:

select a.* from a
select * from a

这不应该被允许和匹配!

但是: - )

select count(*), a.id from a
select a.id, count( * ) from a

这应该被允许并且不匹配!

凭借我糟糕的正则表达式知识,我有以下正则表达式...

\bselect\b.*?(\*|\.\*).*?(?=\bfrom\b)

这个正则表达式可以正常使用*或。*但我仍在努力使用允许的“count(*)”字段选择。

正则表达式并不是最受青睐的部分,我试图清楚地了解正面和负面的LookBehinds / LookAHeads ......这仍然令我困惑:-D

有任何提示吗?

1 个答案:

答案 0 :(得分:1)

尽管阻止人们使用select * from ...及其变体是非常明智的,因为当表格被更改时,他们的查询仍在工作,除非所需的列受到影响,您必须小心不要太过限制性的。

这也会检查子查询:

\bselect(\s*\*\s*|.*\b[a-zA-Z_]\w*\s*\.\s*\*.*)from\b

它会检查简单案例\bselect\s*\*\s*from\b和有效的表名,然后再检查一个.*,其间有可选的空格,但后者可以介于select和{之间的任意位置{1}}。

但它永远不会是完美的,例如这是误报:

from