আরআর 4 এ বৈধতা সহ নিয়মিত প্রকাশ express


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
সাভা

হ্যাঁ, তবে এটি কোনও
উপকারে আসেনি

4
@ উকার্প্ল্যাঙ্ক আমরা অনুমান করছি কেন? রুবিতে irbআমাদের নিশ্চিতভাবে আমাদের জানতে সাহায্য করতে হবে :)
mlibby

4
আপনাকে png এর পরে remove অপসারণ করতে হবে যা নির্দেশ করে যে এটিই শেষ আইটেম এবং এটিকে প্রতিস্থাপন করুন \ z
গ্যারি

উত্তর:


158

^এবং $স্টার্ট হয় লাইন এবং শেষ লাইন নোঙ্গর। যদিও \Aএবং \zস্থায়ী স্টার্ট হয় স্ট্রিং এর এবং শেষ স্ট্রিং এর নোঙ্গর।
পার্থক্যটা দেখ:

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

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

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

পাগল সুতরাং আপনি বলছে, "আপনি কি নিশ্চিতরূপে ব্যবহার করার বিষয়ে নিশ্চিত ^এবং $? আপনি কি ব্যবহার করতে চান না \Aএবং \zপরিবর্তে?"

রেলের সুরক্ষা উদ্বেগ সম্পর্কিত আরও রয়েছে যা এখানে এই সতর্কতা উত্পন্ন করে ।


4
অপ্রয়োজনীয় কথাবার্তা সংশোধন
xaxxon

4
এটি কী জিজ্ঞাসা করছে তা ব্যাখ্যা করে তবে কীভাবে এটি ঠিক করবেন তার উত্তর দেয় না। আমি মনে করি আপনি যদি ^ এবং $ এটির সমাধানের উপায়টি যুক্ত করতে চান তবে: একাধিক => শ্রেণীর শীর্ষে সত্য?
isimmons

@ আইস্মিমনস যোগ করে :multiline => trueআপনি কেবল সতর্কবার্তাটি সংশোধন করে বলছেন যে রেলগুলি আপনি কী করছেন তা আপনি জানেন।
ওল্ডগোড

6
উত্তরটি এখানে রয়েছে: এটি ^ এবং than এর পরিবর্তে \ এ এবং \ জেড ব্যবহার করা উচিত কারণ রুবিতে, ^ এবং only কেবল একটি নতুন লাইন মেলে যা স্ট্রিংয়ের শুরু এবং শেষ নয়, যা জাভাস্ক্রিপ্টকে পরীক্ষায় উত্তীর্ণ হতে দেয়।
জনমারলিনো

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

অধ্যায়গুলি পড়ুন:


গুচ্ছের সেরা, আশা করি আমরা এটি গ্রহণযোগ্য উত্তর দিতে পারি।
mlibby

2

সমস্যাটি রিজএক্সপ শেভ করে না, বরং কনফিগারেশন / আরম্ভকারী / ডিভাইস.আরবিতে থাকে। পরিবর্তন:

# 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.'}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.