2012-07-15 10 views
17

क्या यह वास्तव में यूआरएल क्वेरी स्ट्रिंग में बहुआयामी सरणी synthax का उपयोग करने के लिए सुरक्षित/मान्य है?URL क्वेरी स्ट्रिंग्स में स्क्वायर ब्रैकेट का उपयोग करके सरणी सिंटैक्स मान्य है?

http://example.com?abc[]=123&abc[]=456 

यह हर ब्राउज़र में काम करने लगता है और मैं हमेशा सोचा कि यह उपयोग करने के लिए ठीक था, लेकिन इस लेख में एक टिप्पणी करने के लिए accodring यह नहीं है: http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4

मैं एक दूसरी राय सुनना पसंद करेंगे।

*(pchar/"/"/"?") 

ही आरएफसी की appendix A से::

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
[...] 
pct-encoded = "%" HEXDIG HEXDIG 

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
[...]  
sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

इस बात का मेरे व्याख्या यह है कि कुछ भी isn कि 'है

+0

इसमें "बहुआयामी" क्या है? या आप सर्वर साइड स्क्रिप्टिंग भाषा में सरणी के रूप में प्रतिनिधित्व करने वाले वर्रों का जिक्र कर रहे हैं? – arkascha

+0

@arkascha yep, मेरा मतलब है एक क्वेरी स्ट्रिंग जैसे '? [बी] [सी] [डी] [ई] = एफ', सर्वर साइड स्क्रिप्ट तो इसे एक बहुआयामी सरणी –

उत्तर

12

उत्तर सरल नहीं है।

निम्नलिखित अनुभाग 3.2 से निकाला गया है।RFC 3986 का 2:

एक मेजबान एक इंटरनेट प्रोटोकॉल शाब्दिक पते से पहचान, संस्करण 6
[RFC3513] या बाद में, आईपी शाब्दिक enclosing से भिन्न है
वर्गाकार कोष्ठक में ("[" और "] ")। यह एकमात्र ऐसा स्थान है जहां
यूआरआई वाक्यविन्यास में वर्ग ब्रैकेट वर्णों की अनुमति है।

यह लगता है साफ करते हुए कहा कि वर्ग कोष्ठक यूआरआई में और कहीं भी अनुमति नहीं है से सवाल का जवाब देने। लेकिन एक वर्ग ब्रैकेट चरित्र और एक प्रतिशत एन्कोडेड स्क्वायर ब्रैकेट चरित्र के बीच एक अंतर है।

निम्नलिखित RFC 3986 की धारा 3 की शुरुआत से निकाला जाता है:

  1. सिंटेक्स घटक

    सामान्य url सिंटैक्स की एक पदानुक्रमित अनुक्रम के होते हैं
    घटकों को योजना, प्राधिकरण, पथ, क्वेरी, और
    खंड के रूप में जाना जाता है।

    यूआरआई = योजना ":" हायर-पार्ट ["?" क्वेरी] [ "#" टुकड़ा]

तो "क्वेरी" "URI" का एक घटक है।

निम्नलिखित RFC 3986 की धारा 2.2 से निकाला जाता है:

2,2। आरक्षित पात्र

यूआरआई में घटक और उप-घटक शामिल हैं जो
"आरक्षित" सेट में वर्णित हैं। ये अक्षर कहा जाता है
क्योंकि वे कर सकते हैं "आरक्षित" (या नहीं कर सकते हैं),
सामान्य वाक्य रचना द्वारा डिलीमीटर के रूप में परिभाषित किया जा प्रत्येक योजना विशेष वाक्य रचना के द्वारा, या एक यूआरआई के अपसंदर्भन एल्गोरिथ्म के
कार्यान्वयन-विशिष्ट वाक्यविन्यास द्वारा।
यूआरआई घटक के लिए डेटा परिसीमक के रूप में एक सुरक्षित
चरित्र का उद्देश्य के साथ संघर्ष होगा, तो परस्पर विरोधी डेटा
होना चाहिए प्रतिशत-एन्कोड से पहले यूआरआई ही बना है।

reserved = gen-delims/sub-delims 

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

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

तो वर्ग कोष्ठक एक क्वेरी स्ट्रिंग में दिखाई दे सकते हैं, लेकिन वे प्रतिशत इनकोड करते हों। जब तक कि वे नहीं कर रहे हैं, और नीचे खंड 2.2 में समझाया जा रहे हैं:

यूआरआई अनुप्रयोग का निर्माण करने प्रतिशत एन्कोड डेटा ओक्टेट्स कि
जब तक इन पात्रों
सुरक्षित सेट में पात्रों के अनुरूप विशेष रूप से अनुमति होती है चाहिए यूआरआई योजना
घटक में डेटा का प्रतिनिधित्व करने के लिए।आरक्षित वर्ण यूआरआई घटक में पाया जाता है और
कोई परिसीमन भूमिका है कि चरित्र के लिए जाना जाता है, तो यह होना चाहिए
US-ASCII में है कि
चरित्र के कूट के लिए इसी डेटा ओकटेट प्रतिनिधित्व के रूप में व्याख्या की।

तो क्योंकि वर्ग कोष्ठक केवल "मेजबान" उपघटक में अनुमति दी जाती है, वे प्रतिशत अन्य घटकों और उप-घटक में encoded "चाहिए" सकता है, और "क्वेरी" घटक में इस मामले में, जब तक कि RFC 3986 स्पष्ट रूप से अनुमति देता है unencoded प्रश्न घटक में डेटा का प्रतिनिधित्व करने के लिए वर्ग ब्रैकेट, जो नहीं है।

हालांकि, यदि कोई "यूआरआई उत्पादक अनुप्रयोग" ऐसा करने में विफल रहता है, तो उसे "क्या करना चाहिए", क्वेरी में अनसुलझा स्क्वायर ब्रैकेट छोड़कर, यूआरआई के पाठक यूआरआई को पूरी तरह से अस्वीकार नहीं करना चाहते हैं। इसके बजाए, वर्ग ब्रैकेट को क्वेरी घटक के डेटा से संबंधित माना जाता है, क्योंकि इन घटक में डिलीमीटर के रूप में उपयोग नहीं किया जाता है।

यही कारण है कि, उदाहरण के लिए, यह आरएफसी 3 9 86 का उल्लंघन नहीं है जब PHP एक क्वेरी स्ट्रिंग में मान्य वर्णों के रूप में अनएन्डेड और प्रतिशत एन्कोडेड स्क्वायर ब्रैकेट दोनों स्वीकार करता है, और यहां तक ​​कि उन्हें एक विशेष उद्देश्य भी निर्दिष्ट करता है। हालांकि, ऐसा लगता है कि लेखक जो इस छेड़छाड़ का लाभ लेने का प्रयास नहीं करते हैं, प्रतिशत एन्कोडिंग स्क्वायर ब्रैकेट्स आरएफसी 3986 का उल्लंघन नहीं कर रहे हैं।

+0

"स्क्वायर ब्रैकेट क्वेरी स्ट्रिंग में प्रकट हो सकते हैं यदि वे प्रतिशत एन्कोडेड हैं, जब तक कि वे" xD "न हों। बहुत अच्छा जवाब। –

11

RFC 3986 के अनुसार, एक यूआरएल के Query component निम्नलिखित व्याकरण है टी:

ALPHA/DIGIT/"-"/"."/"_"/"~"/
    "!"/"$"/"&"/"'"/"("/")"/
    "*"/"+"/","/";"/"="/":"/"@" 

..., पीसीटी एन्कोड किया जाना चाहिए i.e प्रतिशत-एन्कोडेड। इस प्रकार [ और ] होना चाहिए आरएफसी 3986.

+3

की तरह व्यवहार करती है आप निश्चित रूप से सही हैं, लेकिन मेरी मदद करें उस व्याख्या के साथ निम्नलिखित। आपके द्वारा दिया गया निकास अधूरा है, 'आरक्षित' का यहां कभी भी उल्लेख नहीं किया गया है। तो परिभाषा इस तरह का कोई मतलब नहीं है। जैसा कि मैंने इसे पढ़ा है स्क्वायर ब्रैकेट को विशेष अर्थ के साथ आरक्षित अक्षरों के रूप में परिभाषित किया गया है (सुनिश्चित नहीं है), इसलिए यदि आप उस अर्थ को व्यक्त करना चाहते हैं तो उन्हें बच नहीं जाना चाहिए। यदि आप से बचते हैं तो आप पैरामीटर के मान के रूप में स्क्वायर ब्रैकेट वाले स्ट्रिंग को बस स्थानांतरित करते हैं। तो मैं खुद से पूछता हूं: ठीक है, क्या वास्तव में स्क्वायर ब्रैकेट का अर्थ यूआरएल में आरक्षित आरएआर का अर्थ है? – arkascha

+0

मैंने उद्धरण में 'आरक्षित' और 'जेन-डेलीम्स' की परिभाषा छोड़ी ताकि यह आसान हो सके कि व्याकरण में '[] 'वर्गीकृत कैसे किया जाता है - ध्यान दें कि केवल' आरक्षित 'का उप-समूह' पचर 'है। –

+0

स्क्वायर ब्रैकेट आईपी v6 पता अक्षर के लिए आरक्षित हैं। http://tools.ietf.org/html/rfc3986#appendix-D.1, http://tools.ietf.org/html/rfc2732#section-2 –

1

मैं हमेशा जब मैं एक सरणी पारित करने के लिए किया था क्वेरी की इस प्रकार की के लिए जाने के लिए एक प्रलोभन था पालन करने के लिए प्रतिशत-एन्कोड किए, लेकिन मैं इसे से दूर चला जाता है। कारण:

  • आरएफसी में परिभाषित नहीं किया गया है।
  • विभिन्न भाषाएं इसे अलग-अलग समझ सकती हैं।

आप एक सरणी पारित करने के लिए कुछ विकल्प होते हैं: (? JSON हो सकता है)

  • एनकोड सरणी के स्ट्रिंग प्रतिनिधित्व
  • "की तरह VAL1 = blah & val2 = blah पैरामीटर है & .. "या ऐसा कुछ।

और अगर आप भाषा का प्रयोग कर रहे के बारे में निश्चित हैं, तो आप (सुरक्षित रूप से) क्वेरी स्ट्रिंग की तरह के लिए जा सकते आप (बस कि आप की आवश्यकता% -encode [] भी करने के लिए)।

+0

के अंदर उपयोग किए जाने पर उन्हें बचने की आवश्यकता नहीं है यह एक वैध मल्टीएरे यूआरएल होगा? '? एबीसी% 5 ब% 5D = 123 & एबीसी% 5 ब% 5D = 456'। बहुत बदसूरत, मैं देखता हूं कि इसका शायद ही कभी –

+1

का उपयोग क्यों किया जाता है, यह इस बात पर निर्भर करेगा कि भाषा इसका कैसा व्यवहार करती है। इससे दूर रहने के लिए सबसे अच्छा है। थोड़ी अधिक सटीक होने के लिए, वे केवल महत्वपूर्ण मूल्य जोड़े हैं। कुछ भी नहीं, कुछ भी कम नहीं है और इसमें कोई "सरणी" नहीं है। – SuperSaiyan

1

मेरी समझ है कि स्क्वायर ब्रैकेट प्रथम श्रेणी के नागरिक नहीं हैं। यहाँ उद्धरण है: http://tools.ietf.org/html/rfc1738

अन्य पात्रों असुरक्षित क्योंकि द्वार और अन्य परिवहन एजेंट इस तरह के पात्रों कभी कभी संशोधित करने के लिए जाना जाता है। ये वर्ण "{", "}", "|", "\", "^", "~", "[", "]", और "` "हैं।

संबंधित मुद्दे