我正在使用这个正则表达式:
[']?[%]?[^"]#([^#]*)#[%]?[']?
在这篇文章中:
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#">
。我希望你理解我的意图吗?
答案 0 :(得分:2)
我认为你可能会误解[^"]
。它并不意味着“没有双引号”,而是意味着“一个字符,这不是双引号”。同样,[^,]
表示“一个字符,不是逗号”。所以你的正则表达式:
[']?[%]?[^"]#([^#]*)#[%]?[']?
将匹配 - 例如 - 这个:
2#,'#
由零单引号,零百分号,一个字符 - 不是双引号(即2
),一个哈希符号,两个字符组成-not-hash-signs(即,'
),一个哈希符号,零百分号和零撇号。 ,'
是括号将捕获的内容。
更新以获取更新的问题:
我不认为你描述的内容可能只使用 一个ColdFusion正则表达式,因为它需要“lookbehind”(以确保某些内容不在之前一个双引号),显然ColdFusion regexes(根据谷歌搜索)不支持。但是:
'?%?(?<!")(?<!"')(?<!"%)(?<!"'%)#(?!\d)[\w.()]+#(?!%?'?")%?'?来确保没有先前的双引号。
.'?%?#(?!\d)[\w.()]+#%?'?(?!")(即,不仅匹配感兴趣的部分,还匹配前面的字符),然后单独确认匹配的子字符串无法启动用双引号?
我也不得不提到,因为听起来你正试图使用基于正则表达式的模式匹配来帮助检测和解决可能的SQL注入点,这是一个坏主意;你永远无法完美地完成这项工作,所以如果有的话,我认为最终增加你注入SQL的风险(增加你对错误方法的依赖)。
答案 1 :(得分:1)
从初始正则表达式中保留捕获组,这是一个修订过的表达式。
'?%?(?!")#([^#]+)#%?'?
答案 2 :(得分:0)
根据您提供的信息,这应该是正确的。
'?%?(?!")#[^#]+#%?'?