【问题标题】:Trying to write REGEX for username validation in Rails尝试在 Rails 中编写用于用户名验证的 REGEX
【发布时间】:2014-11-13 02:33:40
【问题描述】:

我正在尝试在 Ruby (Rails) 中编写一个正则表达式,以便用户名的字符只包含数字和字母(也没有空格)。

我有这个正则表达式 /^[a-zA-Z0-9]+$/,但它似乎不起作用,并且我在 Rails 中收到一个错误,提示“提供的正则表达式正在使用多行锚(^ 或 $),这可能会带来安全性风险。您是要使用 \A 和 \z,还是忘记添加 :multiline => true 选项?"

我在 user.rb 模型中实现的完整代码是:

class User < ActiveRecord::Base
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_USERNAME_REGEX = /^[a-zA-Z0-9]+$/
  validates :username, presence: true, length: { maximum: 20 },
                                    format: { with: VALID_USERNAME_REGEX },
                                    uniqueness: { case_sensitive: false }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                format: { with: VALID_EMAIL_REGEX },
                uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, length: { minimum: 6 }
end

我做错了什么以及如何修复这个正则表达式,使其仅对数字和字母有效,没有空格?谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby regex


    【解决方案1】:

    简答:改用/\A[a-zA-Z0-9]+\z/(正如VALID_EMAIL_REGEX 正在使用的那样)。

    长答案:^$ 锚点将匹配字符串中 的开头和结尾。这意味着如果您的字符串由多行字母数字字符组成,它们将匹配:

    /^[a-zA-Z0-9]+$/ =~ "Ana\nBob\nClara\nDaniel"  #=> 0 (matches)
    

    另一方面,\A\z 将匹配 字符串 的开头和结尾,因此它可以防止用户发送多行字符串(如前面的例子)。

    /\A[a-zA-Z0-9]+\z/ =~ "Ana\nBob\nClara\nDaniel"  #=> nil (doesn't match)
    /\A[a-zA-Z0-9]+\z/ =~ "Erika"                    #=> 0   (matches)
    

    【讨论】:

      【解决方案2】:

      您所要做的就是按照错误消息进行操作。将^(行锚的开始)替换为\A(字符串锚的开始),将$(行锚的结尾)替换为\z(字符串锚的结尾)。除此之外,您的正则表达式按原样工作。

      \A[a-zA-Z0-9]+\z
      

      Rails 存在这种安全问题,因为与某些语言不同,^$ 仅匹配单行的开头/结尾,而不是整个字符串。

      这说明了这种可能的利用示例:

      str = "malicious_code()\naValidUsername"
      str.match(/^[a-zA-Z0-9]+$/) # => #<MatchData "aValidUsername">
      

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多