有一个像这样的查询字符串:
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
有任何提示吗?
答案 0 :(得分:1)
尽管阻止人们使用select * from ...
及其变体是非常明智的,因为当表格被更改时,他们的查询仍在工作,除非所需的列受到影响,您必须小心不要太过限制性的。
这也会检查子查询:
\bselect(\s*\*\s*|.*\b[a-zA-Z_]\w*\s*\.\s*\*.*)from\b
它会检查简单案例\bselect\s*\*\s*from\b
和有效的表名,然后再检查一个.*
,其间有可选的空格,但后者可以介于select
和{之间的任意位置{1}}。
但它永远不会是完美的,例如这是误报:
from