RoR 4 में मान्यताओं के साथ नियमित अभिव्यक्ति


83

निम्नलिखित कोड है:

class Product < ActiveRecord::Base
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
      with: %r{\.(gif|jpg|png)$}i,
      message: 'URL must point to GIT/JPG/PNG pictures'
  }
end

यह काम करता है, लेकिन जब मैं इसे "रेक टेस्ट" का उपयोग करके परीक्षण करने की कोशिश करता हूं, तो मैं इस संदेश को पकड़ लूंगा:

rake aborted!
The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?

इसका क्या मतलब है? मेरे द्वारा यह कैसे किया जा सकता है?


क्या आपने कोशिश की है /\.(gif|jpg|png)$/i? शायद %r{}यह $अंत में खुद को जोड़ता है ।
वुकरप्लैक

@Wukerplank मुझे ऐसा नहीं लगता। %r{\.(gif|jpg|png)$}i #=> /\.(gif|jpg|png)$/i, %r{\.(gif|jpg|png)}i #=> /\.(gif|jpg|png)/i
आरा २०'१३ को .:

हां, लेकिन इससे मदद नहीं मिली
malcoauri

1
@wukerplank क्यों हम अनुमान लगा रहे हैं? रूबी में irbहमें यकीन के लिए जानने में मदद करनी है :)
mlibby

3
आपको पीएनजी के बाद $ निकालने की आवश्यकता है) जो इंगित करता है कि यह अंतिम आइटम है और इसे \ z
गैरी

जवाबों:


158

^और $प्रारंभ कर रहे हैं रेखा के और अंत लाइन के एंकर। जबकि \Aऔर \zस्थायी प्रारंभ कर रहे हैं स्ट्रिंग की और अंत स्ट्रिंग की एंकर।
फर्क देखें:

string = "abcde\nzzzz"
# => "abcde\nzzzz"

/^abcde$/ === string
# => true

/\Aabcde\z/ === string
# => false

तो रेल आपको बता रही है, "क्या आप सुनिश्चित हैं कि आप उपयोग करना चाहते हैं ^और $? क्या आप उपयोग नहीं करना चाहते हैं \Aऔर \zइसके बजाय?"

रेल सुरक्षा चिंताओं पर अधिक है जो इस चेतावनी को यहां उत्पन्न करता है


3
अनावश्यक बोलचाल को ठीक करना
xaxxon

2
यह बताता है कि यह क्या पूछ रहा है लेकिन इसका जवाब नहीं है कि इसे कैसे ठीक किया जाए। मुझे लगता है कि अगर आप ^ का उपयोग करना चाहते हैं और इसे ठीक करने का तरीका $ जोड़ना है: वर्ग के शीर्ष पर बहु ​​= = सच?
इम्मोनियों

@isimmons :multiline => trueआपको जोड़कर केवल यह कहते हुए चेतावनी को ठीक करते हैं कि रेल आपको पता है कि आप क्या कर रहे हैं।
23

6
इसका जवाब है: यह ^ और $ के बजाय ^ और $ का उपयोग करना है क्योंकि रूबी, ^ और $ मैच केवल एक नई रेखा शुरू नहीं होती है और स्ट्रिंग का अंत नहीं होता है, जो एक जावास्क्रिप्ट को परीक्षण पास करने की अनुमति देता है।
जॉनमेरलिनो

31

यह चेतावनी इसलिए उठती है क्योंकि आपका सत्यापन नियम जावास्क्रिप्ट इंजेक्शन के लिए असुरक्षित है।

आपके मामले \.(gif|jpg|png)$में पंक्ति के अंत तक मेल खाता है। तो आपका नियम इस मान pic.png\nalert(1);को सत्य मान लेगा :

"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)$/i
# => true

"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)\z/i
# => false

कार्य पढ़ें:


गुच्छा का सबसे अच्छा, काश हम यह स्वीकार किए जाते हैं जवाब दे सकता है।
मलाईबाई

2

समस्या regexp devise में नहीं है, बल्कि config / initializers / devise.rb में रहती है। परिवर्तन:

# Regex to use to validate the email address
config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i

सेवा:

# Regex to use to validate the email address
  config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/i

1

चेतावनी आपको बता रही है कि निम्नलिखित की तरह तार सत्यापन को पारित करेंगे, लेकिन यह संभवतः नहीं है जो आप चाहते हैं:

test = "image.gif\nthis is not an image"
re = /\.(gif|jpg|png)$/i
re.match(test) #=> #<MatchData ".gif" 1:"gif">

दोनों ^और $किसी भी लाइन, नहीं स्ट्रिंग के प्रारंभ / समाप्ति के प्रारंभ / समाप्ति मेल खाता है। \Aऔर \zक्रमशः पूर्ण स्ट्रिंग की शुरुआत और अंत से मेल खाता है।

re = /\.(gif|jpg|png)\z/i
re.match(test) #=> nil

चेतावनी का दूसरा भाग ("या जोड़ने के लिए भूल गया: बहुस्तरीय => सच्चा विकल्प") आपको बता रहा है कि यदि आप वास्तव में व्यवहार चाहते हैं ^और $आप बस :multilineविकल्प को पारित चेतावनी को चुप कर सकते हैं ।


तो तुम कहाँ से गुजरती हो :multiline?
पिथिकोस

-1

यदि रूबी सुरक्षा के लिए प्रतीक चिन्ह के \zबजाय देखना चाहती है $, तो आपको उसे देने की आवश्यकता है, फिर कोड इस तरह दिखाई देगा:

validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.