2


0

正規表現攻撃ベクトル?

Rubyの正規表現への変数入力をどのように「パラメーター化」しますか? たとえば、私は次のことをしています:

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

(#\ {q})は信頼できないソース(クエリ文字列)からの変数であるため、攻撃ベクトルであると想定する必要があります。 ここでベストプラクティスはありますか?

2 Answer


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


2


だから、ユーザーに任意の正規表現を提供できるようにしたいのか、それとも確かに引用できるリテラルテキストだけを提供したいのか? ユーザーが正規表現とそれが照合されるテキストの両方を提供できる場合、指数ランタイムを使用して式を提供することでDoS攻撃を行うことは難しくありません。