正则表达式锚点的 Brakeman 验证不足警告

Brakeman insufficient validation warning of regex anchors

我正在尝试在这样的模型中实施验证。

validates_format_of :field, with: /[0-9]/, message: 'must have at least one number (0-9)'

Brakeman 检测到这是一个 Format Validation 安全问题,它建议在正则表达式之间添加锚点。

Insufficient validation for 'field' using /[0-9]/. Use \A and \z as anchors near line 54

如果我添加这些锚点,正则表达式就会停止工作,所以我不知道在这种情况下该怎么做。这是我使用 rails c.

进行的测试
"asdf1234".match(/\A[0-9]\z/) # => nil
"foobar1".match(/\A[0-9]\z/) # => nil

在这两种情况下,我都需要方法 return #<MatchData "1">

有什么想法吗? 谢谢。

如果你需要匹配一个字符串,里面至少有1个数字,以及前后的任何其他字符,你可以使用

/\A[^0-9]*[0-9].*\z/m

或者只是

/\A.*[0-9].*\z/m

详情

  • \A - 字符串开头
  • [^0-9]* - 除 ASCII 数字以外的零个或多个字符
  • [0-9] - ASCII 数字
  • .* - 任何 0+ 个字符,尽可能多,直到
  • \z - 字符串结尾。

m 修饰符使 . 匹配任何字符,包括换行符。

实际上,/\A.*[0-9].*\z/m 会慢一点,因为第一个 .* 会一次抓取所有字符串,然后回溯找到最后一个数字。第一个更优化。