代码之家  ›  专栏  ›  技术社区  ›  aronchick

正则表达式攻击向量?

  •  2
  • aronchick  · 技术社区  · 15 年前

    在Ruby中,如何将变量“参数化”输入regex?例如,我正在执行以下操作:

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

    因为它(q)是来自不受信任源(查询字符串)的变量,所以我必须假设它可能是攻击向量。这里有什么最佳实践吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Brian Campbell Dennis Williamson    15 年前

    尝试 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
    
        2
  •  2
  •   Alex Brasetvik    15 年前

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