2017-09-21 10 views
1

私はこのようなモデルで検証を実装しようとしています。Brakeman正規表現のアンカーの検証警告が不十分です

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

制動手は、このFormat Validationセキュリティ上の問題を検出し、それが正規表現の間にアンカーを追加することをお勧めします。

/[0-9] /を使用した 'field'の検証が不十分です。行の近くでアンカーとして\ Aと\ zを使用する

これらのアンカーを追加すると、正規表現が機能しなくなるため、この場合の対処方法がわかりません。 rails cを使って行ったテストは次のとおりです。

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

いずれの場合も、メソッド返信#<MatchData "1">が必要です。

アイデア?おかげさまで あなたが前と後内側の少なくとも1桁を持ち、文字列、およびその他の文字を一致させる必要がある場合は

答えて

1

、あなたが使用すること

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

か、単に

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

詳細

  • \A - 文字列の開始
  • [^0-9]* - ASCII数字
  • .* - - 文字列の終わり -
  • \zまで、できるだけ多くの任意の0+文字、ASCII数字
  • [0-9]以外のゼロまたはそれ以上の文字。

m修飾子を使用すると、改行文字を含む任意の文字に一致するようになります(.)。

実際には/\A.*[0-9].*\z/mは少し遅くなります。最初の.*はすべての文字列を一度に取得してから最後の桁を見つけるためにバックトラックします。最初のものはより最適化されています。

+1

これで解決します。解決策と説明に感謝します。 – CatBrownie