Rails

2014-11-13 15 views
5

için kullanıcı adı doğrulaması için REGEX yazmaya çalışıyorum Ruby (Rails) uygulamasında normal bir ifade yazmaya çalışıyorum, böylece kullanıcı adının karakterleri yalnızca sayılar ve harfler (boşluk içermiyor) içeriyor.Rails

Bu regex'im var, /^[a-zA-Z0-9]+$/, ancak çalışmıyor gibi görünüyor ve Rails bir hata alıyorum diyor "Verilen düzenli ifade çok satırlı çapa (^ veya $) kullanıyor, bu güvenlik riski sunabilir \ A ve \ z'yi kullanmak mı, yoksa şunu eklemek istediniz: multiline => true option? Benim user.rb modelinde bu uygulama için

Benim tam kodudur:

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+\-.][email protected][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 

yanlış yapıyorum ve sadece rakam ve harflerden ve hiçbir alanlar için geçerli olduğunu bu yüzden bu regex nasıl çözebileceğinizi ? Teşekkürler.

cevap

9

kısa cevap:

Bu kullanım, bu olası bir örneğini gösterir.

Uzun cevap: ^ ve $ çapalar bir dizede bir hattı başını ve sonunu eşleşir. Bu senin dize alfanümerik karakterlerin birden fazla satır oluşuyorsa Eşleştiklerinden anlamına gelir:

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

ve diğer taraftan \z, dolayısıyla olası bir engelleyecek bir dize başlangıcını ve bitişini eşleşir Çok satırlı bir dize gönderen bir kullanıcının saldırması (önceki örnekte olduğu gibi).

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

Bu işe yaradı! – jtarr523

2

Tek yapmanız gereken hata mesajını takip etmektir.(hat bağlantısı başlangıcı) \A (dize bağlantısı başlangıcı) ve $ (satır sonu bağlantısı) ile \z (dize bağlantısı sonu) ile değiştirin. Bunun dışında, regex'in olduğu gibi çalışır. Bazı dillerde farklı olarak, ^ ve $ sadece ziyade tüm dize yerine bir tek hat başı/sonu maç çünkü

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

Raylar bu güvenlik endişelerini vardır. Bunun yerine /\A[a-zA-Z0-9]+\z/ kullanımı (VALID_EMAIL_REGEX kullanarak gibi) hazırlanmıştır:

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