在Ruby中如何“参数化”变量输入到正则表达式?例如,我做了以下内容:正则表达式攻击矢量?
q = params[:q]
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{q}/i }.compact
由于它(#{Q})是来自不受信任的来源(查询字符串)的变量,我必须假设它可能是一个攻击向量。这里有什么最佳实践?
在Ruby中如何“参数化”变量输入到正则表达式?例如,我做了以下内容:正则表达式攻击矢量?
q = params[:q]
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{q}/i }.compact
由于它(#{Q})是来自不受信任的来源(查询字符串)的变量,我必须假设它可能是一个攻击向量。这里有什么最佳实践?
>> 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
完美,谢谢! – aronchick 2009-12-23 23:26:26
那么,你想让用户能够提供一个任意的正则表达式,或只是一些文字文本,肯定可以引用?如果用户既可以提供正则表达式又可以提供匹配的文本,通过提供具有指数运行时的表达式来执行DoS攻击并不困难。
确实红宝石有'\ Q ... \ E'? – 2009-12-23 21:17:57
把它关掉你的服务器,并在JavaScript中执行它。 – 2009-12-23 21:23:14
+1考虑到用户提供的正则表达式可能是一种代码注入形式。 – sleske 2009-12-23 23:39:24