ruby-on-rails – 消除用户正则表达式
发布时间:2020-12-17 02:58:14 所属栏目:百科 来源:网络整理
导读:我想编写一个允许用户根据正则表达式匹配数据的函数,但我担心用户字符串的卫生.我知道使用SQL查询可以使用绑定变量来避免SQL注入攻击,但我不确定是否有这样的 regexp机制.我看到有 Regexp.escape,但我想允许有效的正则表达式. 这是示例函数: def tagged?(te
我想编写一个允许用户根据正则表达式匹配数据的函数,但我担心用户字符串的卫生.我知道使用SQL查询可以使用绑定变量来避免SQL注入攻击,但我不确定是否有这样的
regexp机制.我看到有
Regexp.escape,但我想允许有效的正则表达式.
这是示例函数: def tagged?(text) tags.each do |tag| return true if text =~ /#{tag.name}/i end return false end 因为我只是直接在tag.name上匹配,是否有人可以插入一个Proc调用或某些东西来打破正则表达式并造成破坏? 任何关于最佳实践的建议将不胜感激. 解决方法
Regexp中的插值字符串不会被执行,但会产生恼人的警告:
/#{exit -3}/.match('test') # => exits foo = '#{exit -3}' /#{foo}/.match('test') # => warning: regexp has invalid interval # => warning: regexp has `}' without escape 这两个警告似乎分别与开场#{和结束}有关,并且是独立的. 作为一种更高效的策略,您可能希望将标记列表清理为可以运行一次的组合正则表达式.构造和测试N个正则表达式的效率通常远低于具有N个部分的1个. 也许是这样的: class Taggable def tags @tags end def tags=(value) @tags = value @tag_regexp = Regexp.new( [ '^(?:',@tags.collect do |tag| '(?:' + tag.sub(/#{/,'#{').sub(/([^])}/,'1}') + ')' end.join('|'),')$' ].to_s,Regexp::IGNORECASE ) end def tagged?(text) !!text.match(@tag_regexp) end end 这可以这样使用: e = Taggable.new e.tags = %w[ #{exit-3} .*.gif .*.png .*.jpe?g ] puts e.tagged?('foo.gif').inspect 如果执行了退出调用,程序将暂停,但它只是将其解释为文字字符串.为了避免警告,它会被反斜杠转义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |