正则表达式:试图改善这个正则表达式

时间:2011-12-12 01:23:30

标签: regex coldfusion

我正在使用这个正则表达式:

[']?[%]?[^"]#([^#]*)#[%]?[']?

在这篇文章中:

insert into table (id,name,age) values ('#var1#' ,#var2#,'#var3#', 3, 'name') where id = '#id#' like "" 
and test=<cfqueryparam value="#id#">

出于某种原因,它抓住了#var2#'#var3#'之间的逗号 但当我加入一个[^,]时,它开始做奇怪的事情。 有人可以帮我这个。

当我现在阅读我的正则表达式时,它应该找到任何东西:

  • 可能只有一个引用
  • 可能有百分比
  • 没有双引号
  • 然后有一个哈希(#
  • 后面没有哈希,但是所有其他字符
  • 然后有一个哈希值,后跟一个百分比或引用

那么为什么,当我在前面添加“没有逗号”时,正则表达式会破坏?


更新的问题:

好的,我试着解释一下:查询看起来像这样:

SELECT  e.*, m.man_id, m.man_title, c.cat_id, c.cat_name
FROM    ec_products e, ec_categories c, ec_manufacturers m
WHERE   c.cat_id = e.prod_category AND
        e.prod_manufacturer = m.man_id AND
        e.prod_title LIKE <cfqueryparam value="%#attributes.keyword#%"> and
test='#var1#'
ORDER BY e.prod_title  

现在我想要##之间的每个值,而不是queryparam标记所包围的值。因此,在示例中,我确实需要#var1#,而不是#attributes.keyword#。原因是查询中没有被标记包围的所有参数都是不安全的,并且可能导致SQL注入。我现在的正则表达式是

(?!")'?%?#(?!\d)[\w.\(\)]+#%?'?(?!")

它几乎就在那里。由于attributes.keyword,它确实找到%。我只想要那些##但没有被双引号括起来的东西,所以不是"##"。这将为我提供sql中的所有不安全的params,例如'#var#'#aNumber#'%##''%##%''##%,但不是

<cfqueryparam value="#variable#">

。我希望你理解我的意图吗?

3 个答案:

答案 0 :(得分:2)

我认为你可能会误解[^"]。它并不意味着“没有双引号”,而是意味着“一个字符,这不是双引号”。同样,[^,]表示“一个字符,不是逗号”。所以你的正则表达式:

[']?[%]?[^"]#([^#]*)#[%]?[']?

将匹配 - 例如 - 这个:

2#,'#

由零单引号,零百分号,一个字符 - 不是双引号(即2),一个哈希符号,两个字符组成-not-hash-signs(即,'),一个哈希符号,零百分号和零撇号。 ,'是括号将捕获的内容。


更新以获取更新的问题:

我不认为你描述的内容可能只使用 一个ColdFusion正则表达式,因为它需要“lookbehind”(以确保某些内容不在之前一个双引号),显然ColdFusion regexes(根据谷歌搜索)不支持。但是:

  • This StackOverflow answer提供了一种在ColdFusion中使用Java正则表达式的方法。如果您使用该技术,那么您可以使用Java正则表达式
    '?%?(?<!")(?<!"')(?<!"%)(?<!"'%)#(?!\d)[\w.()]+#(?!%?'?")%?'?
    来确保没有先前的双引号。
  • 您从未提及过如何使用此正则表达式。是否可以匹配
    .'?%?#(?!\d)[\w.()]+#%?'?(?!")
    (即,不仅匹配感兴趣的部分,还匹配前面的字符),然后单独确认匹配的子字符串无法启动用双引号?

我也不得不提到,因为听起来你正试图使用​​基于正则表达式的模式匹配来帮助检测和解决可能的SQL注入点,这是一个坏主意;你永远无法完美地完成这项工作,所以如果有的话,我认为最终增加你注入SQL的风险(增加你对错误方法的依赖)。

答案 1 :(得分:1)

从初始正则表达式中保留捕获组,这是一个修订过的表达式。

'?%?(?!")#([^#]+)#%?'?

答案 2 :(得分:0)

根据您提供的信息,这应该是正确的。

'?%?(?!")#[^#]+#%?'?