gpt4 book ai didi

ruby-on-rails - 清理用户正则表达式

转载 作者:数据小太阳 更新时间:2023-10-29 07:29:35 26 4
gpt4 key购买 nike

我想编写一个允许用户根据正则表达式匹配数据的函数,但我担心用户字符串的卫生问题。我知道对于 SQL 查询,您可以使用绑定(bind)变量来避免 SQL 注入(inject)攻击,但我不确定正则表达式是否有这样的机制。我看到有 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 个正则表达式的效率通常远低于 1 个具有 N 个部分的正则表达式。

也许是这样的:

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

如果执行了 exit 调用,程序会停在那里,但它只是将其解释为文字字符串。为了避免警告,它用反斜杠转义。

关于ruby-on-rails - 清理用户正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1985812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com