বৈধ কী এবং কোনও ইউআরআই কোয়েরিতে নেই?


101

পটভূমি (আরও নীচে প্রশ্ন)

আমি এই পিছনে পিছনে আরএফসি এবং এসও প্রশ্নগুলি পড়ার চেষ্টা করছি এবং এখনও আমি জ্যাক পাইনি।

সুতরাং আমি অনুমান করি যে আমরা কেবল "সেরা" উত্তরের পক্ষে ভোট দিয়েছি এবং এটিই নাকি?

মূলত এটি এ পর্যন্ত ফোটে।

3.4। অনুসন্ধানের উপাদান

উত্স দ্বারা ব্যাখ্যা করার জন্য ক্যোয়ারী উপাদানটি তথ্যের একটি স্ট্রিং।

query = *uric

ক্যোয়ারী উপাদানগুলির মধ্যে, ";", "/", "?", ":", "@", "&", "=", "+", ",", এবং "$" সংরক্ষণ করা হয়েছে।

প্রথম যে জিনিসটি আমাকে চটজলদি করে তা হল * ইউরিকটি এই জাতীয় সংজ্ঞাযুক্ত

uric = reserved | unreserved | escaped

reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","

এটি যেমন অনুচ্ছেদে কিছুটা স্পষ্ট করা হয়েছে

উপরের "সংরক্ষিত" সিনট্যাক্স ক্লাসটি সেই অক্ষরগুলিকে বোঝায় যেগুলি ইউআরআইয়ের মধ্যে অনুমোদিত, তবে জেনেরিক ইউআরআই সিনট্যাক্সের কোনও নির্দিষ্ট উপাদানগুলির মধ্যে অনুমোদিত হতে পারে না; সেগুলি বিভাগ 3 এ বর্ণিত উপাদানগুলির সীমানা হিসাবে ব্যবহৃত হয় used

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

এই শেষ অংশটি কিছুটা পিছনের দিকে অনুভূত হয় তবে এটি স্পষ্টভাবে জানিয়ে দেয় যে সংরক্ষিত চরিত্র সেটটি প্রসঙ্গে নির্ভর করে। তবুও states.৪ বলেছে যে সমস্ত সংরক্ষিত অক্ষরগুলি একটি কোয়েরি উপাদানগুলির মধ্যে সংরক্ষিত আছে, তবে, এখানে কেবল শব্দার্থগুলি পরিবর্তিত করবে এমন প্রশ্নগুলি প্রশ্ন চিহ্ন (?) এড়িয়ে চলেছে কারণ ইউআরআইরা কোয়েরি স্ট্রিংয়ের ধারণাটি সংজ্ঞায়িত করে না।

এই মুহুর্তে আমি পুরোপুরি আরএফসিগুলিকে ছেড়ে দিয়েছি তবে আরএফসি 1738 বিশেষভাবে আকর্ষণীয় পেয়েছি।

একটি HTTP URL ফর্মটি গ্রহণ করে:

http://<host>:<port>/<path>?<searchpart>

<path> এবং <searchpart> উপাদানগুলির মধ্যে, "/", ";", "?" সংরক্ষিত শ্রেণিবদ্ধ কাঠামো নির্ধারণ করতে HTTP- র মধ্যে "/" অক্ষর ব্যবহার করা যেতে পারে।

আমি অন্তত এইচটিটিপি ইউআরএল সম্পর্কিত যে এটি আরএফসি 1738 আরএফসি 2396 কে ছাড়িয়ে যায় এর সাথে এটি ব্যাখ্যা করি Because এতক্ষণে করছি

প্রশ্ন

আমি যখন অন্য সংস্থার অনুরোধের সাথে সংখ্যার একটি তালিকা পাস করতে চেয়েছিলাম তখন এটি শুরু হয়েছিল। আমি এর বেশি ভাবি নি, এবং এটি কেবল কমা দ্বারা পৃথক করা মান হিসাবে পাস করেছি। কমা পালাতে গেলেও আমার অবাক লাগল। page.html?q=1,2,3এনকোড করা ক্যোয়ারী page.html?q=1%2C2%2C3এটিতে রূপান্তরিত হয়ে কাজ করে তবে এটি কুৎসিত এবং এটি প্রত্যাশা করে না। আরএফসির মধ্য দিয়ে যেতে শুরু করেছি।

আমার প্রথম প্রশ্নটি সহজভাবে, এনকোডিং কমাগুলি কি আসলেই প্রয়োজনীয়?

আরএফসি 2396 অনুসারে আমার উত্তর: হ্যাঁ, আরএফসি 1738 অনুসারে: না

পরে আমি অনুরোধগুলির মধ্যে তালিকাগুলি পাসের বিষয়ে সম্পর্কিত পোস্টগুলি পেয়েছি। যেখানে সিএসভি অ্যাপ্রোচ খারাপ হিসাবে দেখিয়েছিল। এটি পরিবর্তে প্রদর্শিত হয়েছিল, (এটি আগে দেখেনি)।

page.html?q=1;q=2;q=3

আমার দ্বিতীয় প্রশ্ন, এটি কি একটি বৈধ URL?

আরএফসি 2396 অনুসারে আমার উত্তর: না, আরএফসি 1738 অনুসারে: না (; সংরক্ষিত)

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

Default.aspx?a=1;a=2&b=1&a=3

Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"

যখন আমি "ক" জিজ্ঞাসা করি তখন আমি এটিতে কমা দিয়ে একটি স্ট্রিং পাই বলে সিএসভি পদ্ধতির থেকে এটি কীভাবে আলাদা হয় তা আমি দেখতে ব্যর্থ হয়েছি। এএসপি.এনইটি অবশ্যই কোনও রেফারেন্স বাস্তবায়ন নয় তবে এটি আমাকে এখনও হতাশ করে না।

তবে সবচেয়ে গুরুত্বপূর্ণ - আমার তৃতীয় প্রশ্ন - এটির জন্য স্পেসিফিকেশনটি কোথায়? এবং আপনি কি করবেন বা এই বিষয়টি না করার জন্য?


আরএফসি 1738 প্রায় 4 বছর পরে আরএফসি 2396 প্রকাশিত হয়েছিল, তখন কীভাবে আরএফসি 2396 কে উপেক্ষা করতে পারে?
ম্যাথু ফ্ল্যাশেন

4
ইউআরএল এবং যা ব্যবহারিকভাবে বোধগম্যতা সম্পর্কিত তা সম্পর্কে এটি আমার ব্যাখ্যা যা এটি করে। (সুপারসিড সম্ভবত সম্ভবত সঠিক শব্দ নয়, কারণ এটি আরএফসি টার্মিনোলজিতে পুরানো আরএফসি থেকে অবহেলিত হিসাবে ব্যবহৃত হয়েছে, আরএফসি 1738 কেবল অনুমান করা সমস্ত অনুভব করে না যখন এটি পাওয়া যায় যদি আপনি অনুসন্ধানের অংশে কোয়েরি স্ট্রিং রাখতে পারবেন) ইউআরএল এর)
জন লিডেগ্রেন

উত্তর:


70

একটি চরিত্রটি জেনেরিক ইউআরএল উপাদানগুলির মধ্যে সংরক্ষিত থাকে তার অর্থ এই নয় যে উপাদানটির মধ্যে বা উপাদানটির মধ্যে থাকা ডেটাগুলির মধ্যে উপস্থিত হলে অবশ্যই তাকে পলায়ন করতে হবে। চরিত্রটিকে জেনেরিক বা স্কিম-নির্দিষ্ট সিনট্যাক্সের মধ্যে একটি ডিলিমিটার হিসাবে সংজ্ঞায়িত করতে হবে এবং চরিত্রের উপস্থিতি অবশ্যই ডেটাগুলির মধ্যে থাকতে হবে।

জেনেরিক ইউআরআইয়ের জন্য বর্তমান মানটি আরএফসি 3986 , যা এই কথাটি বলে:

2.2। সংরক্ষিত অক্ষর

ইউআরআইতে উপাদানগুলি এবং উপ-উপাদানগুলি অন্তর্ভুক্ত থাকে যা "সংরক্ষিত" সেটটিতে অক্ষর দ্বারা সীমিত করা হয়। এই অক্ষরগুলিকে "সংরক্ষিত" বলা হয় কারণ এগুলি জেনেরিক সিনট্যাক্স দ্বারা, প্রতিটি স্কিম-নির্দিষ্ট সিনট্যাক্স দ্বারা বা ইউআরআই-এর ডিসিফেরেন্সিং অ্যালগরিদমের প্রয়োগ-নির্দিষ্ট সিনট্যাক্স দ্বারা ডিলিমিটার হিসাবে সংজ্ঞায়িত করা যেতে পারে (বা নাও)। যদি কোনও ইউআরআই উপাদানগুলির ডেটা সীমানার হিসাবে কোনও সংরক্ষিত চরিত্রের উদ্দেশ্যগুলির সাথে বিরোধ করে would যুক্ত করা হয় [জোর দেওয়া], তবে ইউআরআই গঠনের আগে বিবাদী ডেটা অবশ্যই শতাংশ-এনকোড হওয়া উচিত।

   সংরক্ষিত = জেন-ডিলিম / সাব-ডিলিমস

   Gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

   সাব-ডিলিমস = "!" / "$" / "&" / "" "/" ("/") "
               / "*" / "+" / "," / ";" / "="

3.3। পথের উপাদান

[...]
pchar = অনারक्षित / pct-encoded / উপ-ডিলিম / ":" / "@"
[...]

৩.৪ কোয়েরি কম্পোনেন্ট

[...]
      ক্যোয়ারী = * (পিসার / "/" / "?")

সুতরাং কমাগুলি স্ট্রিমের মধ্যে স্পষ্টভাবে মঞ্জুরিপ্রাপ্ত এবং কেবলমাত্র নির্দিষ্ট স্কিমগুলি এটিকে একটি সীমানা হিসাবে সংজ্ঞায়িত করলেই কেবল ডেটাতে পালানো দরকার। এইচটিটিপি স্কিম কোয়েরি স্ট্রিংগুলিতে একটি বিস্ময়করূপী হিসাবে কমা বা আধা-কোলন ব্যবহার করে না, তাই তাদের পালানোর দরকার নেই। ব্রাউজারগুলি এই স্ট্যান্ডার্ডটি অনুসরণ করে কিনা তা অন্য বিষয়।

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

আরএফসি 2396 হিসাবে, এটি এইচটিটিপি ক্যোয়ারী স্ট্রিংগুলিতে অনস্কেপড কমাগুলির জন্যও অনুমতি দেয়:

2.2। সংরক্ষিত অক্ষর

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

যেহেতু এইচটিটিপি স্কিমের অধীনে কমাগুলির কোনও সংরক্ষিত উদ্দেশ্য নেই, তাই তাদের ডেটাতে পালাতে হবে না। সংরক্ষিত অক্ষর সম্পর্কে § ২.৩ থেকে প্রাপ্ত নোটটি যা শব্দ-পরিবর্তনগুলি পরিবর্তন করে যখন শতাংশ-এনকোডযুক্ত কেবলমাত্র সাধারণত প্রয়োগ হয়; অক্ষরগুলি নির্দিষ্ট স্কিমগুলির জন্য শব্দার্থবিজ্ঞান পরিবর্তন না করে শতাংশ-এনকোড করা হতে পারে এবং এখনও সংরক্ষিত থাকতে পারে।


24

একটি ক্যোয়ারী স্ট্রিংয়ে বৈধ কি তা উত্তর দেওয়ার জন্য আমি অনুরোধ করার সময় কোন বিশেষ অক্ষরগুলি ক্রোমের দ্বারা প্রতিস্থাপিত হয় তা পরীক্ষা করে দেখেছি:

Space -> %20
! -> !
" -> %22
# -> removed, marks the end of the query string
% -> %
& -> &
' -> %27
( -> (
) -> )
* -> *
+ -> + (this usually means blank when received at the server, so encode if necessary)
, -> ,
- -> -
. -> .
/ -> /
: -> :
; -> ;
< -> %3C
= -> =
> -> %3E
? -> ?
@ -> @
[ -> [
\ -> \
] -> ]
^ -> ^
_ -> _
` -> `
{ -> {
| -> |
} -> }
~ -> ~

Extended ASCII (like °) -> Every character from this set is encoded

দ্রষ্টব্য: এর অর্থ সম্ভবত এই নয় যে আপনি লিঙ্কগুলির জন্য ইউআরআই তৈরি করার সময় এমন চরিত্রগুলি প্রতিস্থাপন করা উচিত নয় যা প্রতিস্থাপন হয় নি। উদাহরণস্বরূপ এটি প্রায়শই ~সামঞ্জস্যতার কারণে ইউআরআইতে ব্যবহার না করার পরামর্শ দেওয়া হয় তবে এটি এখনও একটি বৈধ চরিত্র।

অন্য উদাহরণ হ'ল প্লাস-সাইন যা বৈধ, তবে সাধারণত কোনও অনুরোধের অংশ হিসাবে কোনও সার্ভার যখন এটি গ্রহণ করে তখন সাধারণত এনকোড ফাঁকা হিসাবে বিবেচিত হয়। সুতরাং এটি এনকোড হওয়া উচিত এমনকি বৈধ হওয়া সত্ত্বেও যখন উদ্দেশ্যটি কোনও প্লাসকে উপস্থাপন করা হয় এবং কোনও স্থান নয়।

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


কি /programming/2366260/whats-valid-and-whats-not-in-a-uri-query?param=b#1;c#2একটি বৈধ ক্যোয়ারী মাপদন্ড?
সুমিত জৈন

@ সুমিতজাইন না, কারণ #ইউআরআই-এর কোয়েরি অংশের অভ্যন্তরে উপস্থিত হতে পারে না। আপনার এটির মতো এনকোড করা দরকার %23, যাতে ইউআরআই হওয়া উচিত /programming/2366260/whats-valid-and-whats-not-in-a-uri-query?param=b%231;c%232
দাই

10

শুধু ব্যবহার ?q=1+2+3

আমি এখানে একটি চতুর্থ প্রশ্নের উত্তর দিচ্ছি :) যা জিজ্ঞাসা করেনি তবে সমস্ত দিয়ে শুরু হয়েছিল: আমি কীভাবে একটি লা কমা-বিচ্ছিন্ন মানগুলির তালিকা পাস করব? আমার কাছে মনে হয় সর্বোত্তম পন্থা হ'ল কেবল তাদের স্থান-বিচ্ছিন্নভাবে পাস করা, যেখানে স্পেসগুলি ইউআরএল-ফর্ম-এনকোড হবে +। দুর্দান্ত কাজ করে, যতক্ষণ আপনি জানেন তালিকার মানগুলিতে কোনও ফাঁকা স্থান নেই (কিছু সংখ্যায় থাকে না)।


যদিও এটি একটি মন্তব্য হওয়া উচিত (যেমন এটি প্রশ্নের উত্তর দেয় না), আপনাকে ধন্যবাদ। +আমি যে কমা ব্যবহার করতে চাইছিলাম সেই নির্দিষ্ট ক্ষেত্রে আরও বোধগম্য করে।
গাজুস

6

page.html? q = 1; q = 2; q = 3

এটি কি বৈধ ইউআরএল?

হ্যাঁ. ;সংরক্ষিত, কিন্তু না একটি জন্য RFC দ্বারা। যে উপাদানটি এই উপাদানটিকে সংজ্ঞায়িত করে তা হ'ল application/x-www-form-urlencodedমিডিয়া ধরণের সংজ্ঞা , যা এইচটিএমএল স্ট্যান্ডার্ডের অংশ ( 17.13.4.1 )। বিশেষত বিভাগ বি .২.২ এ লুক্কায়িত লুক্কায়িত নোট :

আমরা এইচটিটিপি সার্ভার বাস্তবায়নকারীদের এবং বিশেষত সিজিআই বাস্তবায়নকারীরা ";" এর ব্যবহার সমর্থন করার পরামর্শ দিচ্ছি; এই পদ্ধতিতে লেখকদের "&" অক্ষরগুলি পালানোর ঝামেলা "&" এর জায়গায় "

দুর্ভাগ্যক্রমে ASP.NET সহ অনেক জনপ্রিয় সার্ভার-সাইড স্ক্রিপ্টিং ফ্রেমওয়ার্কগুলি এই ব্যবহারটিকে সমর্থন করে না।


সুতরাং যখন ?q=1;q=2;q=3কোয়েরি বৈধ, এটা দ্ব্যর্থক: কিছু সার্ভার সাইড অবকাঠামো এটা পড়তে হবে মানে { q: '1;q=2;q=3' }, অন্যান্য তা সদৃশ করতে পারে { q: {'1', '2', '3'}}
নাস বানভ

4
হ্যাঁ. এবং সবচেয়ে খারাপ কী, এইচটিএমএল 5 এখন ভাষাটি অন্তর্ভুক্ত করে না ;, এর অর্থ এইচটিএমএল 4 এবং এইচটিএমএল 5 অসামঞ্জস্যপূর্ণ। উগ, একটি নির্দিষ্ট নথিতে অ-আদর্শিক ভাষার বিপদ ...
ববিন্স

@ নাসবানভ এবং এখনও অন্যরা (যেমন পিএইচপি) এর ব্যাখ্যা দেবে{ q: 3 }
নিকোলাস শ্যাঙ্কস

4
@ নিকোলাসশ্যাঙ্কস - যেখানে পিএইচপি জড়িত রয়েছে, সমস্ত বেট বন্ধ রয়েছে! :)
নাস বনভ

1

আমি লক্ষ করতে চাই যে page.html?q=1&q=2&q=3এটি একটি বৈধ urlও। এটি একটি ক্যোয়ারী স্ট্রিংয়ে কোনও অ্যারে প্রকাশ করার সম্পূর্ণ বৈধ উপায়। আপনার সার্ভার প্রযুক্তি ঠিক কীভাবে উপস্থাপন করা হবে তা নির্ধারণ করবে।

ক্লাসিক এএসপিতে, আপনি চেক করুন Response.QueryString("q").Countএবং তারপরে Response.QueryString("q")(0)(এবং (1) এবং (2) ব্যবহার করুন।

নোট করুন যে আপনি এটি আপনার এএসপি.নেটেও দেখেছেন (আমি মনে করি এটি উদ্দেশ্য নয়, তবে দেখুন):

Default.aspx?a=1;a=2&b=1&a=3

Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"

লক্ষ করুন যে সেমিকোলনটি উপেক্ষা করা হয়েছে, সুতরাং আপনি aদুবার সংজ্ঞা দিয়েছেন এবং কমা দ্বারা আলাদা হয়ে আপনি এর মান দুটি পেয়েছেন। সমস্ত অ্যাম্পারস্যান্ডগুলি ব্যবহার করে "1,2,3" হিসাবে Default.aspx?a=1&a=2&b=1&a=3ফল পাবেন a। তবে আমি নিশ্চিত যে প্রতিটি স্বতন্ত্র উপাদান পাওয়ার জন্য একটি পদ্ধতি আছে, যদি উপাদানগুলিতে নিজেরাই কমা থাকে। এটি অনুলিখিত ক্যোরিস্ট্রিংয়ের কেবলমাত্র ডিফল্ট সম্পত্তি যা কমা বিভাজকগুলির সাথে একসাথে উপ-মানগুলিকে সম্মতি দেয়।


1

আমারও একই প্রশ্ন ছিল. হাইপারলিঙ্কযুক্ত URL টি একটি তৃতীয় পক্ষের ইউআরএল এবং ফর্ম্যাটে প্যারামিটারগুলির তালিকা প্রত্যাশা করছিলpage.html?q=1,2,3 কেবলমাত্র এবং URL টি কার্যকর page.html?q=1%2C2%2C3হয়নি। আমি এটি জাভাস্ক্রিপ্ট ব্যবহার করে কাজ করতে সক্ষম হয়েছি। সেরা পদ্ধতির নাও হতে পারে তবে সমাধানটি যদি কারও সাহায্য করে তবে এটি এখানে পরীক্ষা করে দেখতে পারেন।


-3

আপনি যদি এনক্রোড অক্ষরগুলি ফ্ল্যাশ / এসডাব্লুএফ ফাইলে প্রেরণ করছেন তবে আপনার চরিত্রটি দুবার এনকোড করা উচিত !! (ফ্ল্যাশ পার্সারের কারণে)

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