在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