আরআর 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.