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.