【问题标题】:Regex: SQL-Query-String match * or .* but count(*)正则表达式:SQL-Query-String 匹配 * 或 .* 但 count(*)
【发布时间】:2017-03-23 23:40:05
【问题描述】:

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

select a.* from a
select * from a

这应该是不允许和匹配的!

但是:-)

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

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

由于我的正则表达式知识贫乏,我有以下正则表达式...

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

这个正则表达式与 * 或 .* 配合得很好,但我仍在努力解决允许的“count(*)”字段选择。

Regex 不是最受青睐的部分,我试图弄清楚正面和负面的 LookBehinds/LookAHeads... 这仍然让我感到困惑 :-D

有什么提示吗?

【问题讨论】:

  • 应该,不应该匹配的规则是什么?正则表达式在 PHP 或 mysql 中使用?也许^\bselect[^,]+from.*$
  • 为了理解正确,这是在PHP中使用正则表达式创建SQL解析器?
  • 你是对的。它是一个用 PHP 编写的 SQL 解析器。我只是想防止该死的 * 或 .* ;-)
  • select 6 * b from a 呢?

标签: php mysql regex


【解决方案1】:

虽然阻止人们使用select * from ... 及其变体是非常聪明的做法,但因为当表被更改时,除非所需的列受到影响,否则他们的查询仍然有效,但您必须小心不要过于严格。

这也检查子查询:

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

它检查简单的情况\bselect\s*\*\s*from\b 和一个有效的表名,然后是.*,两者之间有可选的空格,但后者可以是selectfrom 之间的任何地方。

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

select 'select * from ' || b from a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2014-01-07
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多