正则表达攻击向量?

时间:2009-12-23 21:13:50

标签: ruby-on-rails ruby regex security

如何将一个“参数化”变量输入到Ruby中的Regex中?例如,我正在做以下事情:

q = params[:q]
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{q}/i }.compact

由于它(#{q})是来自不受信任的来源(查询字符串)的变量,我不得不假设它可能是攻击向量。这里有什么最好的做法吗?

2 个答案:

答案 0 :(得分:3)

尝试Regexp.escape

>> Regexp.escape('foo\bar\baz$+')
=> "foo\\\\bar\\\\baz\\$\\+"

所以你的代码看起来像:

q = params[:q]
re = Regexp.escape(q)
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{re}/i }.compact

答案 1 :(得分:2)

那么,您是否希望用户能够提供任意正则表达式,或者只是一些肯定可以引用的文字文本?如果用户可以同时提供正则表达式和将尝试匹配的文本,则通过提供具有指数运行时的表达式来进行DoS攻击并不困难。