2014-11-13 17 views
5

Próbuję napisać wyrażenie regularne w Ruby (Rails), tak aby znaki nazwy użytkownika zawierały tylko cyfry i litery (również bez spacji).Próbuję napisać REGEX dla sprawdzania poprawności nazwy użytkownika w Railsach

Mam to wyrażenie regularne, /^[a-zA-Z0-9]+$/, ale wygląda na to, że nie działa i pojawia się błąd w Railsach, który mówi "Podane wyrażenie regularne używa zakotwiczeń wielowierszowych (^ lub $), które mogą stanowić zagrożenie bezpieczeństwa Czy chciałeś użyć \ A i \ z, lub zapomniałeś dodać: multiline => true option? "

mój pełny kod dla tej implementacji w moim modelu user.rb jest:

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 

Co robię źle i jak mogę rozwiązać ten regex tak, że tylko jest ważna dla liczb i liter i bez spacji ? Dzięki.

Odpowiedz

9

Krótki odpowiedź: użyciu /\A[a-zA-Z0-9]+\z/ zamiast (jak VALID_EMAIL_REGEX stosuje).

Długi Odpowiedź: ^ i $ kotwice dopasuje początek i koniec linii w ciąg. Oznacza to, że jeśli ciąg składa się z wielu wierszy znaków alfanumerycznych będą zgodne:

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

\A i \z drugiej strony dopasuje początek i koniec ciąg, stąd będzie ona zapobiec możliwym atak przez użytkownika wysyłającego ciąg wielowierszowy (jak w poprzednim przykładzie).

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

Dzięki temu zadziałało! – jtarr523

2

Wszystko, co musisz zrobić, to postępować zgodnie z komunikatem o błędzie. Zastąp ^ (początek kotwicy linii) z \A (początek kotwicy ciągu) i $ (koniec kotwicy linii) z \z (koniec kotwicy ciągu). Poza tym twoje regex działa tak jak jest.

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

Rails ma ten problem bezpieczeństwa, ponieważ w przeciwieństwie do niektórych językach, ^ i $ tylko dopasować początek/koniec jednej linii, zamiast całego łańcucha.

ten ilustruje przykład jest to możliwe wykorzystanie:

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