মধ্যে পার্থক্য কি URI.escape
এবং CGI.escape
এবং যা আমি ব্যবহার করা উচিত?
মধ্যে পার্থক্য কি URI.escape
এবং CGI.escape
এবং যা আমি ব্যবহার করা উচিত?
উত্তর:
কিছু ছোট পার্থক্য ছিল, কিন্তু গুরুত্বপূর্ণ পয়েন্ট যে URI.escape
হয়েছে অবচিত রুবি 1.9.2 করুন ... তাই ব্যবহার CGI::escape
বা ERB :: Util.url_encode ।
আগ্রহীদের জন্য রুবি-কোর নিয়ে দীর্ঘ আলোচনা চলছে যা ওয়েইব্রিক :: HTTPUtils.escape এবং WEBrick :: HTTPUtils.escape_form উল্লেখ করে ।
ERB::Util.url_encode
সঠিকভাবে ব্যবহার করে%20
একটি কুড়াল এবং একটি তরোয়াল মধ্যে পার্থক্য এবং কোনটি আমার ব্যবহার করা উচিত? ভাল এটি আপনার কী করা উচিত তার উপর নির্ভর করে।
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
অপ্রচলিত হিসাবে চিহ্নিত করা হয়েছিল:
তদতিরিক্ত বর্তমান ইউআরআই.এনকোড হ'ল সাধারণ জিএসব। তবে আমি মনে করি এটির কোনও ইউআরআই উপাদানগুলিতে বিভক্ত হওয়া উচিত, তারপরে প্রতিটি উপাদানগুলি এড়িয়ে চলুন এবং শেষ পর্যন্ত তাদের সাথে যোগ দিন।
সুতরাং বর্তমান ইউআরআই.এনকোডকে ক্ষতিকারক এবং অবমূল্যায়ন হিসাবে বিবেচনা করা হয়। এটি মুছে ফেলা হবে বা আচরণটি মারাত্মকভাবে পরিবর্তন করা হবে।
এই সময়ে প্রতিস্থাপন কি?
যেমন আমি উপরে বলেছি, বর্তমান ইউআরআই.এনকোড স্পেক স্তরে ভুল। সুতরাং আমরা সঠিক প্রতিস্থাপন সরবরাহ করব না। প্রতিস্থাপনটি এর ব্যবহারের ক্ষেত্রে পৃথক হবে।
দুর্ভাগ্যক্রমে ডক্সে এটি সম্পর্কে একটিও শব্দ নেই, এটি সম্পর্কে জানার একমাত্র উপায় হ'ল উত্সটি পরীক্ষা করা, বা ভার্বোজ স্তর ( -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
যদি কেবল ফর্ম পালাবার প্রয়োজন হয় তবে ব্যবহার করুনAddressable
আপনার রত্নগুলির মধ্যে একটি হিসাবে সামর্থ্য রাখতে পারেন তবে আপনি প্রথমে ইউআরএল পার্স করতে পারবেন, ফাই রবডোক ইন্টিফো
Addressable:URL
, আপনি তারপরে এটিতে সমস্ত উদাহরণ পদ্ধতি কল করতে পারেন, সম্ভবত তাদের মধ্যে একটির আপনার পছন্দসই ফলাফল পাবেন: রুবডোক ইন্টিও
ইউআরআই.এসপেকেপ একটি দ্বিতীয় প্যারামিটার নেয় যা আপনাকে কী অনিরাপদ চিহ্নিত করতে দেয়। এপিআইডক দেখুন:
CGI::escape
পাঠ্য বিভাগে বেঁচে থাকার পক্ষে ভাল তাই সেগুলি ইউআরএল কোয়েরি পরামিতিগুলিতে ব্যবহার করা যেতে পারে ('এর পরে স্ট্রিংগুলি?') উদাহরণস্বরূপ আপনি যদি ইউআরএলটিতে স্ল্যাশ অক্ষর যুক্ত প্যারামিটার রাখতে চান তবে আপনি সিজিআই :: প্রথমে সেই স্ট্রিংটি ছেড়ে যান এবং তারপরে এটি ইউআরএল sertোকান।
তবে কারাগারে আপনি সম্ভবত এটি সরাসরি ব্যবহার করবেন না। সাধারণত আপনি ব্যবহার করেন hash.to_param
যা CGI::escape
হুডের নীচে ব্যবহার করবে ।
URI::escape
ইউআরএল থেকে বেরিয়ে আসার জন্য ভাল যা সঠিকভাবে এড়ানো যায় নি। উদাহরণস্বরূপ কিছু ওয়েবসাইটগুলি তাদের অ্যাঙ্কর ট্যাগটিতে ভুল / আনস্কেপড url আউটপুট দেয়। যদি আপনার প্রোগ্রামটি আরও সংস্থানগুলি পেতে এই url ব্যবহার করে তবে ওপেনআরআই ইউআরএলগুলি অবৈধ বলে অভিযোগ করবে। URI::escape
এটিকে একটি বৈধ url করার জন্য আপনার এগুলি দরকার । সুতরাং এটিটিকে যথাযথ করতে পুরো ইউআরআই স্ট্রিং এড়ানোর জন্য ব্যবহৃত হয়। আমার শব্দটিতে ইউআরআই :: ইউনেস্কেপ একটি ইউআরএল মানুষের দ্বারা পঠনযোগ্য করে তোলে এবং ইউআরআই :: এড়িয়ে যাওয়া ব্রাউজারগুলিকে বৈধ করে তোলে।
এগুলি আমার সাধারণ ব্যক্তির পদ এবং এগুলি সংশোধন করতে নির্দ্বিধায়।
পার্থক্যটি হ'ল ইউআরআই.স্কেপ কাজ করছে না ...
CGI.escape"/en/test?asd=qwe"
=> "%2Fen%2Ftest%3Fasd%3Dqwe"
URI.escape"/en/test?asd=qwe"
=> "/en/test?asd=qwe"
CGI.escape কোয়েরি স্ট্রিংয়ের একটি URL মান থেকে বেরিয়ে আসার জন্য। সমস্ত অক্ষর যা আলফা, ডিজিট, '_', '-', 'এ পড়ে না। এবং '' চরিত্র সেটটি পালিয়ে গেছে।
তবে এটি একটি ইউআরএলকে ভুল করে তুলবে, যেহেতু ইউআরএলটির '/', ':', '?', '[', '&', '=', এবং ';' থাকা দরকার। সম্ভবত আরও বেশি যে আমি আমার মাথার উপরের অংশের কথা ভাবতে পারি না।
ইউআরআই.এসপেকেপ এই ইউআরএল অক্ষরগুলিকে একা ফেলে দেয় এবং পালানোর জন্য ক্যোরি স্ট্রিং কী এবং মানগুলি অনুসন্ধান করার চেষ্টা করে। তবে এটি সত্যিকার অর্থে নির্ভর করা যায় না কারণ মানগুলিতে সব ধরণের অক্ষর সহজেই পালাতে বাধা দেয়। মূলত, এটি অনেক দেরি করে। তবে যদি ইউআরএলটি সাধারণ হতে পারে (মানগুলির ক্ষেত্রে '&' গুলি এবং '=' ইত্যাদি) না হয় তবে এই ফাংশনটি সম্ভবত অপঠনযোগ্য বা অবৈধ অক্ষরগুলি থেকে বাঁচতে ব্যবহৃত হতে পারে।
সাধারণভাবে - '&' এর সাথে যুক্ত হওয়ার আগে এবং '?' এর পরে যুক্ত করার আগে সর্বদা স্বতন্ত্র কী এবং মানগুলিতে CGI.escape ব্যবহার করুন।
ওপেনপ্রজেক্ট এপিআই দিয়ে সিজিআই.এসকেপ কাজ করেনি। এটি এনকোড করেছে [],: এবং + টি নয়। আমি একসাথে এটি হ্যাক করেছি যা ওপেনপ্রজেক্টের এপিআইয়ের জন্য এখনও পর্যন্ত কাজ করে বলে মনে হচ্ছে। তবে আমি নিশ্চিত এটি কিছু .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] "