ইউআরআই.স্কেপ এবং সিজিআই.সেস্কেপের মধ্যে পার্থক্য কী?


উত্তর:


124

কিছু ছোট পার্থক্য ছিল, কিন্তু গুরুত্বপূর্ণ পয়েন্ট যে URI.escapeহয়েছে অবচিত রুবি 1.9.2 করুন ... তাই ব্যবহার CGI::escapeবা ERB :: Util.url_encode

আগ্রহীদের জন্য রুবি-কোর নিয়ে দীর্ঘ আলোচনা চলছে যা ওয়েইব্রিক :: HTTPUtils.escape এবং WEBrick :: HTTPUtils.escape_form উল্লেখ করে


11
কেবল বিভ্রান্তি যুক্ত করতে - আমি কেবল স্ট্যাকওভারফ্লো . com/Questions/4967608/… এ একটি মন্তব্য দেখেছি যেখানে কেউ উল্লেখ করেছে যে সিজি এস্কেপ স্পেসের জন্য% 20 এর পরিবর্তে '+' ব্যবহার করে, এবং এটি 'স্পেস' এর বিরুদ্ধে ...
লুই সাইয়ার্স

18
একটি বিকল্প হ'ল স্পেসগুলির জন্য ERB::Util.url_encodeসঠিকভাবে ব্যবহার করে%20
রিফ্রাফ

1
@ আর্নেস্ট: দেখুন: github.com/ruby/ruby/commit/… (উত্তর আপডেট হয়েছে)
মার্ক-আন্দ্রে লাফোর্টুন

4
ruby-doc.org/stdlib-2.0.0/libdoc/uri/rdoc/URI/Ecreen.html । রুবি ২.০.০ এ ইউআরআই.এসপেকেড মডিউল রয়েছে। কেন এটি অবমূল্যায়ন করা হয়েছিল?
user938363

1
@ ব্যবহারকারী938363 আপনি যদি সেখানে উত্স উত্সটিতে ক্লিক করেন তবে দেখতে পাবেন এটি এখনও অবচিত হিসাবে চিহ্নিত হয়েছে।
আঁকুন

229

একটি কুড়াল এবং একটি তরোয়াল মধ্যে পার্থক্য এবং কোনটি আমার ব্যবহার করা উচিত? ভাল এটি আপনার কী করা উচিত তার উপর নির্ভর করে।

URI.escapeএর মধ্যে একটি স্ট্রিং (ইউআরএল) এনকোড করার কথা ছিল, সুতরাং " পার্সেন্ট-এনকোডিং " called

CGI::escapeসিজিআই স্পেক থেকে আসছে , যা ওয়েব সার্ভার এবং অ্যাপ্লিকেশনের মধ্যে কীভাবে ডেটা এনকোড / ডিকোড করা উচিত তা বর্ণনা করে।

এখন, আসুন আমরা আপনাকে বলি যে আপনার অ্যাপ্লিকেশনটিতে একটি ইউআরআই থেকে বাঁচতে হবে। এটি আরও নির্দিষ্ট ব্যবহারের ক্ষেত্রে use তার জন্য, রুবি সম্প্রদায় URI.escapeবছরের পর বছর ধরে ব্যবহার করত । সমস্যাটি URI.escapeহ'ল এটি আরএফসি -3896 অনুমানটি পরিচালনা করতে পারেনি।

URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog' 
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"

URI.escape অপ্রচলিত হিসাবে চিহ্নিত করা হয়েছিল:

তদতিরিক্ত বর্তমান ইউআরআই.এনকোড হ'ল সাধারণ জিএসব। তবে আমি মনে করি এটির কোনও ইউআরআই উপাদানগুলিতে বিভক্ত হওয়া উচিত, তারপরে প্রতিটি উপাদানগুলি এড়িয়ে চলুন এবং শেষ পর্যন্ত তাদের সাথে যোগ দিন।

সুতরাং বর্তমান ইউআরআই.এনকোডকে ক্ষতিকারক এবং অবমূল্যায়ন হিসাবে বিবেচনা করা হয়। এটি মুছে ফেলা হবে বা আচরণটি মারাত্মকভাবে পরিবর্তন করা হবে।

এই সময়ে প্রতিস্থাপন কি?

যেমন আমি উপরে বলেছি, বর্তমান ইউআরআই.এনকোড স্পেক স্তরে ভুল। সুতরাং আমরা সঠিক প্রতিস্থাপন সরবরাহ করব না। প্রতিস্থাপনটি এর ব্যবহারের ক্ষেত্রে পৃথক হবে।

https://bugs.ruby-lang.org/issues/4167

দুর্ভাগ্যক্রমে ডক্সে এটি সম্পর্কে একটিও শব্দ নেই, এটি সম্পর্কে জানার একমাত্র উপায় হ'ল উত্সটি পরীক্ষা করা, বা ভার্বোজ স্তর ( -wW2) এর কিছু সতর্কতা সহ স্ক্রিপ্ট চালানো ( ) অথবা কিছু গুগল-ফু ব্যবহার করুন)।

কিছু ক্যোয়ারী প্যারামিটারগুলির জন্য ব্যবহারের প্রস্তাব করেছিল CGI::Escape, কারণ আপনি একটি সম্পূর্ণ ইউআরআই এড়াতে পারবেন না:

CGI::escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http%3A%2F%2Fgoogle.com%2Ffoo%3Fbar%3Dat%23anchor%26title%3DMy+Blog+%26+Your+Blog"

CGI::escapeশুধুমাত্র ক্যোয়ারী প্যারামিটারগুলির জন্য ব্যবহার করা উচিত, তবে ফলাফলগুলি আবারও অনুমানের বিরুদ্ধে থাকবে। আসলে সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে ফর্মের ডেটা এড়ানো, যেমন কোনও application/x-www-form-urlencodedপোষ্ট অনুরোধ প্রেরণের সময় ।

এছাড়াও উল্লেখ WEBrick::HTTPUtils.escapeকরা উন্নতির বেশি নয় (আবার এটি কেবল একটি সরল gsub, যা আইএমও, এর চেয়েও খারাপ বিকল্প URI.escape):

WEBrick::HTTPUtils.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog" 

অনুমানটির নিকটতমটি অ্যাড্রেসযোগ্য রত্ন বলে মনে হচ্ছে :

require 'addressable/uri'
Addressable::URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at#anchor&title=My%20Blog%20&%20Your%20Blog"

লক্ষ্য করুন, পূর্ববর্তী সমস্ত বিকল্পের মতো, ঠিকানাযোগ্য এড়ায় না #এবং এটি প্রত্যাশিত আচরণ। আপনি #হ্যাশটিকে ইউআরআই পথে রাখতে চান তবে ইউআরআই কোয়েরিতে নয়।

কেবলমাত্র সমস্যাটি হ'ল আমরা আমাদের ক্যোয়ারী প্যারামিটারগুলি যথাযথভাবে এড়িয়ে চলিনি, যা আমাদের সিদ্ধান্তে নিয়ে আসে: আমাদের পুরো ইউআরআইয়ের জন্য একটি পদ্ধতি ব্যবহার করা উচিত নয়, কারণ কোনও সঠিক সমাধান নেই (এখনও অবধি)। আপনি যেমন দেখেন &"আমার ব্লগ এবং আপনার ব্লগ" থেকে রেহাই পান নি। আমাদের ক্যোয়ারী প্যারামগুলির জন্য পালানোর একটি আলাদা ফর্ম ব্যবহার করতে হবে, যেখানে ব্যবহারকারীরা বিভিন্ন অক্ষর রাখতে পারেন যার URL গুলিতে একটি বিশেষ অর্থ রয়েছে। ইউআরএল এনকোড প্রবেশ করান। ইউআরএল এনকোড প্রতিটি "সন্দেহজনক" ক্যোয়ারী মানের জন্য ব্যবহার করা উচিত, যা এর মতো ERB::Util.url_encode:

ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""

এটি দুর্দান্ত তবে আমাদের ইতিমধ্যে ঠিকানা দরকার:

uri = Addressable::URI.parse("http://www.go.com/foo")
# => #<Addressable::URI:0x186feb0 URI:http://www.go.com/foo>
uri.query_values = {title: "My Blog & Your Blog"}
uri.normalize.to_s
# => "http://www.go.com/foo?title=My%20Blog%20%26%20Your%20Blog"

উপসংহার:

  • ব্যবহার URI.escapeবা অনুরূপ না
  • আপনার CGI::escapeযদি কেবল ফর্ম পালাবার প্রয়োজন হয় তবে ব্যবহার করুন
  • আপনার যদি ইউআরআইয়ের সাথে কাজ করার দরকার হয় তবে ঠিকানাযোগ্য ব্যবহার করুন এটি ইউআরএল এনকোডিং, ফর্ম এনকোডিং এবং ইউআরএলগুলিকে স্বাভাবিক করে।
  • যদি এটি একটি রেলস প্রকল্প হয় তবে " আমি কীভাবে ইউআরএল থেকে রেলগুলিতে রক্ষা পাব? "

তথ্যের জন্য অনেক ধন্যবাদ. এটি নিশ্চিতভাবে কিছু নিড়ানি পরীক্ষার সতর্কতা থেকে মুক্তি পেয়েছে। নীচে একটি তাক এবং একটি নিড়ানি দেখুন।
ডগলাস জি। অ্যালেন

@ আর্নেস্টের দুর্দান্ত ব্যাখ্যা, তবে এর সাথে সমস্যাটি হ'ল এটি বাহ্যিক ইউআরএলগুলির জন্য কাজ করবে না যা আমি তৈরি করার চেষ্টা করছি না (এবং এর কোনও নিয়ন্ত্রণ নেই)। উদাহরণস্বরূপ ক্রোলার্স যা কোনও ওয়েব পৃষ্ঠা থেকে ইউআরএল পড়ে এবং তারপরে সেই ইউআরএলগুলি অ্যাক্সেস করার চেষ্টা করে (যা অ্যাক্সেসের আগে এনকোড করা দরকার)।
amit_saxena

@ অ্যামিট_স্যাক্সেনা যদি আপনি Addressableআপনার রত্নগুলির মধ্যে একটি হিসাবে সামর্থ্য রাখতে পারেন তবে আপনি প্রথমে ইউআরএল পার্স করতে পারবেন, ফাই রবডোক ইন্টিফো
আর্নেস্ট

মজাদার! তবে আবার, আমি এটি ব্যবহার করে মূল ইউআরএল থেকে পরামিতিগুলির একটি হ্যাশ পেতে পারি না, যা আমি আপনাকে বর্ণনার সাথে সাথে এনকোড করব। আমার ক্ষেত্রে প্রবাহটি হ'ল: আমি কিছু ফিড -> যা পরে আমার এনকোড করা প্রয়োজন -> কনটেন্ট আনতে http ক্লায়েন্ট থেকে পাস করতে হবে তার বাহ্যিক url পাই get এখন আমি যদি বাহ্যিক ইউআরএলগুলি সঠিকভাবে এনকোড না করি তবে রুবি ভিত্তিক এইচটিটিপি ক্লায়েন্টগুলি অবৈধ ইউআরআই ত্রুটিগুলি ব্যর্থ করে।
amit_saxena

@ অ্যামিট_স্যাক্সেনা পার্স পদ্ধতিটি এর উদাহরণটি ফিরে আসবে Addressable:URL, আপনি তারপরে এটিতে সমস্ত উদাহরণ পদ্ধতি কল করতে পারেন, সম্ভবত তাদের মধ্যে একটির আপনার পছন্দসই ফলাফল পাবেন: রুবডোক ইন্টিও
আর্নেস্ট

9

ইউআরআই.এসপেকেপ একটি দ্বিতীয় প্যারামিটার নেয় যা আপনাকে কী অনিরাপদ চিহ্নিত করতে দেয়। এপিআইডক দেখুন:

http://apidock.com/ruby/CGI/escape/class

http://apidock.com/ruby/URI/Escape/escape


দুর্দান্ত উত্তর @ রবার্ট স্পিকার।
হালকা আলো

6

CGI::escapeপাঠ্য বিভাগে বেঁচে থাকার পক্ষে ভাল তাই সেগুলি ইউআরএল কোয়েরি পরামিতিগুলিতে ব্যবহার করা যেতে পারে ('এর পরে স্ট্রিংগুলি?') উদাহরণস্বরূপ আপনি যদি ইউআরএলটিতে স্ল্যাশ অক্ষর যুক্ত প্যারামিটার রাখতে চান তবে আপনি সিজিআই :: প্রথমে সেই স্ট্রিংটি ছেড়ে যান এবং তারপরে এটি ইউআরএল sertোকান।

তবে কারাগারে আপনি সম্ভবত এটি সরাসরি ব্যবহার করবেন না। সাধারণত আপনি ব্যবহার করেন hash.to_paramযা CGI::escapeহুডের নীচে ব্যবহার করবে ।


URI::escapeইউআরএল থেকে বেরিয়ে আসার জন্য ভাল যা সঠিকভাবে এড়ানো যায় নি। উদাহরণস্বরূপ কিছু ওয়েবসাইটগুলি তাদের অ্যাঙ্কর ট্যাগটিতে ভুল / আনস্কেপড url আউটপুট দেয়। যদি আপনার প্রোগ্রামটি আরও সংস্থানগুলি পেতে এই url ব্যবহার করে তবে ওপেনআরআই ইউআরএলগুলি অবৈধ বলে অভিযোগ করবে। URI::escapeএটিকে একটি বৈধ url করার জন্য আপনার এগুলি দরকার । সুতরাং এটিটিকে যথাযথ করতে পুরো ইউআরআই স্ট্রিং এড়ানোর জন্য ব্যবহৃত হয়। আমার শব্দটিতে ইউআরআই :: ইউনেস্কেপ একটি ইউআরএল মানুষের দ্বারা পঠনযোগ্য করে তোলে এবং ইউআরআই :: এড়িয়ে যাওয়া ব্রাউজারগুলিকে বৈধ করে তোলে।

এগুলি আমার সাধারণ ব্যক্তির পদ এবং এগুলি সংশোধন করতে নির্দ্বিধায়।


1

পার্থক্যটি হ'ল ইউআরআই.স্কেপ কাজ করছে না ...

CGI.escape"/en/test?asd=qwe"
=> "%2Fen%2Ftest%3Fasd%3Dqwe"

URI.escape"/en/test?asd=qwe"
=> "/en/test?asd=qwe"

2
আপনি ভুল পরীক্ষার কেসটি বেছে নিয়েছেন .. / 's,?' S এবং = 'গুলি সমস্তই একটি বৈধ ইউআরআইয়ের অংশ এবং সুতরাং এড়ানো যায় নি। বিশেষত ক্যোয়ারী স্ট্রিংয়ে যে অন্যান্য অক্ষরগুলি পালাতে হবে সেগুলি হওয়া উচিত।
জেরার্ড ওনেইল

@ জিআরআরডোনিল আমি কীভাবে ইউআরআই.এসপেকে কাজ করছে না এবং বিশ্বাসযোগ্য নয় তা দেখানোর জন্য পরীক্ষার কেসটি নির্বাচন করেছি। আপনি কি পরামর্শ দিচ্ছেন যে ইউআরআই.এসপেকে কেবল ক্যোয়ারী স্ট্রিং থেকে বেরিয়ে আসছে? এটি কীভাবে বলতে পারে যে আমি যখন কোনও & এ এনকোড করতে চাইলে কোনও প্যারামিটার মান শেষ হয়? সম্ভবত এটি কেন অচল?
রাদু সিমিনেস্কু

1
আমি ঠিক তাই বলছি। ইউআরআই এস্কেপটি ইউআরএল বিশ্লেষণ করতে হবে, পৃথক প্যারামিটারগুলি কী মনে করে তা পৃথক করে, এড়াতে এবং তাদের আবার একসাথে রেখে দিতে হয় put এমনকি যে অগোছালো হতে পারে। তবে এটি তা করে না - এটি কেবলমাত্র কিছু চরিত্রগুলি পালিয়ে যাওয়া এড়িয়ে যায় যখন বাকী অংশগুলি অব্যাহতি দেয়, যা এটি অসম্পূর্ণ করে তোলে। এটি সাধারণ ক্ষেত্রে ব্যবহার করা যেতে পারে বিশেষত যদি আপনি জানেন যে আপনার প্যারামিটারগুলি হবে না .. বিভ্রান্তিকর।
জেরার্ড ওনেইল

0

CGI.escape কোয়েরি স্ট্রিংয়ের একটি URL মান থেকে বেরিয়ে আসার জন্য। সমস্ত অক্ষর যা আলফা, ডিজিট, '_', '-', 'এ পড়ে না। এবং '' চরিত্র সেটটি পালিয়ে গেছে।

তবে এটি একটি ইউআরএলকে ভুল করে তুলবে, যেহেতু ইউআরএলটির '/', ':', '?', '[', '&', '=', এবং ';' থাকা দরকার। সম্ভবত আরও বেশি যে আমি আমার মাথার উপরের অংশের কথা ভাবতে পারি না।

ইউআরআই.এসপেকেপ এই ইউআরএল অক্ষরগুলিকে একা ফেলে দেয় এবং পালানোর জন্য ক্যোরি স্ট্রিং কী এবং মানগুলি অনুসন্ধান করার চেষ্টা করে। তবে এটি সত্যিকার অর্থে নির্ভর করা যায় না কারণ মানগুলিতে সব ধরণের অক্ষর সহজেই পালাতে বাধা দেয়। মূলত, এটি অনেক দেরি করে। তবে যদি ইউআরএলটি সাধারণ হতে পারে (মানগুলির ক্ষেত্রে '&' গুলি এবং '=' ইত্যাদি) না হয় তবে এই ফাংশনটি সম্ভবত অপঠনযোগ্য বা অবৈধ অক্ষরগুলি থেকে বাঁচতে ব্যবহৃত হতে পারে।

সাধারণভাবে - '&' এর সাথে যুক্ত হওয়ার আগে এবং '?' এর পরে যুক্ত করার আগে সর্বদা স্বতন্ত্র কী এবং মানগুলিতে CGI.escape ব্যবহার করুন।


0

ওপেনপ্রজেক্ট এপিআই দিয়ে সিজিআই.এসকেপ কাজ করেনি। এটি এনকোড করেছে [],: এবং + টি নয়। আমি একসাথে এটি হ্যাক করেছি যা ওপেনপ্রজেক্টের এপিআইয়ের জন্য এখনও পর্যন্ত কাজ করে বলে মনে হচ্ছে। তবে আমি নিশ্চিত এটি কিছু .gsub এর অনুপস্থিত। এটি সম্ভবত ইউআরআই.এসপেকেপের মতো প্রায় খারাপ, তবে এটি আপনাকে অপ্রচলিত ত্রুটিগুলি দেয় না।

class XXX
      def self.encode(path)
        path, query = path.split("?", 2)
        return path if query.nil?
        query = CGI.escape(query).gsub("%3A", ":").gsub("%3D","=").gsub("%5B","[").gsub("%5D","]").gsub("%2C",",").gsub("+","%20")
        return [path,query].join("?")
      end
end

XXX.encode("http://test.com/some/path?query=[box: \"cart\"]")
URI.encode("http://test.com/some/path?query=[box: \"cart\"]")

উভয় আউটপুট:

=> " http://test.com/some/path?query=mittedboxbox :%20%22cart%22] "
=> " http://test.com/some/path?query=selbox :%20 % 22cart% 22] "

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