क्वेरी स्ट्रिंग परम और छिपे हुए पारम के साथ एक GET फॉर्म सबमिट करना गायब हो जाता है


231

इस रूप पर विचार करें:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

इस फॉर्म को जमा करते समय (GET फॉर्म) पैरामीटर a और b गायब हो रहे हैं। क्या इसका कोई कारण है? क्या इस व्यवहार से बचने का कोई तरीका है?


3
आपका एक्शन तत्व विकृत है।
एड्रियन गोडोंग

उन्हें गायब नहीं होना चाहिए, इसलिए मुझे लगता है कि हमें आपका फ़ॉर्म देखना होगा।
UnkwnTech

2
नमस्ते, यहां पूर्ण रूप दिया गया है, आप बस इस फॉर्म के साथ एक HTML बना सकते हैं और देख सकते हैं कि मैं जिन क्रियाओं में गुजरता हूं वे गायब हैं: <form action = " example.com?e=4&f=5 " विधि = "GET"> <इनपुट प्रकार = "छिपा हुआ" नाम = "एक" मान = "1" /> <इनपुट प्रकार = "छिपा हुआ" नाम = "बी" मूल्य = "2" /> <इनपुट प्रकार = "छिपा हुआ" नाम = "सी" मान = "3" /> <इनपुट प्रकार = "सबमिट" /> </ फार्म>

1
वैसे, आप जानते हैं कि आप उस क्रिया मान पर एक अंतिम उद्धरण याद कर रहे हैं? पूरी तरह से मुख्य मुद्दे से अलग, लेकिन ...
जय

मैंने यहां जावास्क्रिप्ट का उपयोग करके एक संभावित वर्कअराउंड पोस्ट किया है: stackoverflow.com/questions/3548795/…
जेनी ओ'रिली

जवाबों:


263

नहीं है कि क्या छिपे हुए मापदंडों के साथ शुरू करने के लिए कर रहे हैं ...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

मैं क्रिया URL में किसी भी मौजूदा क्वेरी स्ट्रिंग को बनाए रखने वाले किसी भी ब्राउज़र पर भरोसा नहीं करूंगा।

विनिर्देशों के रूप में ( RFC1866 , पृष्ठ 46; HTML 4.x खंड 17.13.3) स्थिति:

यदि विधि "प्राप्त" है और कार्रवाई एक HTTP यूआरआई है, तो उपयोगकर्ता एजेंट कार्रवाई का मूल्य लेता है, एक `जोड़ता है? इसके लिए, फिर "एप्लिकेशन / x-www-form-urlencoded" सामग्री प्रकार का उपयोग करके एन्कोडेड फॉर्म डेटा सेट को संलग्न करता है।

हो सकता है कि कोई प्रश्न-चिह्न और मापदंडों को एम्बेड करने के लिए एक्शन-URL को प्रतिशत-एनकोड कर सकता है, और फिर किसी की उंगलियों को पार करने की आशा करता है कि सभी ब्राउज़र उस URL को छोड़ देंगे (और यह सत्यापित करें कि सर्वर इसे भी समझता है)। लेकिन मैं उस पर कभी भरोसा नहीं करता।

वैसे: यह गैर-छिपे हुए फ़ॉर्म फ़ील्ड के लिए अलग नहीं है। POST के लिए एक्शन URL एक क्वेरी स्ट्रिंग धारण कर सकता है।


71

HTML5 में, यह प्रति-कल्पना व्यवहार है।

Http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm देखें

"4.10.22.3 फॉर्म सबमिशन अल्गोरिथम" देखें, स्टेप 17। एक जीटी फॉर्म के मामले में http / s URI के लिए क्वेरी स्ट्रिंग के साथ:

गंतव्य को एक नया URL होने दें जो क्रिया के बराबर हो, सिवाय इसके कि इसके <query>घटक को क्वेरी द्वारा प्रतिस्थापित किया जाता है (यदि उपयुक्त हो तो U + 003F QUESTION MARK वर्ण (?) जोड़कर।

तो, आपका ब्राउज़र मौजूदा "...?" को आपके URI के हिस्से को रद्दी कर देगा और इसे आपके फॉर्म के आधार पर एक नए के साथ बदल देगा।

HTML 4.01 में, कल्पना अवैध URIs पैदा करती है - अधिकांश ब्राउज़र वास्तव में ऐसा नहीं करते थे ..

Http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , चरण चार देखें - URI होगा a? संलग्न है, भले ही यह पहले से ही एक हो।


इसका मतलब है: ?एक्शन यूआरएल में पीछे सब कुछ हटा दिया जाता है? तो क्या है, अगर कार्रवाई url में GET पैरामीटर में लक्ष्य शामिल है, जहां फॉर्म को संसाधित किया जाना चाहिए? पसंद: action="index.php?site=search"। मुझे यकीन नहीं है, अगर जीईटी पैरामीटर को छिपे इनपुट क्षेत्रों में रखा जाए तो यह एक ईश्वर विचार है।
13

आपका क्या मतलब है प्रति-कल्पना @xyphoid से?
अमीनादिमी

@AmiNadimi: इसका अर्थ है "विनिर्देश के अनुसार"।
पुनरावर्ती

14

आप जो कुछ भी कर सकते हैं वह जीईटी जानकारी वाले टेबल पर एक साधारण फोरचेक का उपयोग कर रहा है। उदाहरण के लिए php में:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

23
नोट: कभी भी इस उदाहरण कोड का उपयोग नहीं करें जैसा कि लिखा गया है। यह बहुत खतरनाक होगा। GET के मान उपयोगकर्ता से आते हैं, इसलिए उन्हें पहले से बचने के बिना पृष्ठ पर नहीं लिखा जाना चाहिए।
दिन १

16
इस कोड में XSS बग तय होने तक डाउनवोट करना।
spookylukey

1
यह उत्तर एक समान समाधान प्रदान करता है, लेकिन XSS के लिए व्यावहारिक नहीं है।
vvzh

यह सरणी मापदंडों को संभाल नहीं करता है
एंड्रयू

5

आपको दो आइटम (ए और बी) को छिपे हुए इनपुट तत्वों के साथ-साथ सी भी शामिल करना चाहिए।


हां, अगर संभव हो तो मैं यह करूंगा। लेकिन मैं कहता हूं कि मेरे पास क्वेरी स्ट्रिंग और छिपे हुए इनपुट में पैरामीटर हैं, मैं क्या कर सकता हूं?

मुझे लगता है कि आपका एकमात्र विकल्प क्वेरी स्ट्रिंग नाम / मूल्य जोड़े को पार्स करना और छिपे हुए इनपुट फ़ील्ड का उत्पादन करना है। हो सकता है कि यदि आपने पृष्ठ और URL के संदर्भ में थोड़ा और अधिक वर्णन किया हो, तो हम कार्यशील समाधान सुझा सकते हैं।
बर्नहार्ड हॉफमैन

वैकल्पिक रूप से, डेटा को छिपे हुए फॉर्म आइटम्स से लें, और उन्हें URL और अतिरिक्त क्वेरी पैरामीटर में जोड़ें, फिर फॉर्म सबमिट बटन को साधारण एंकर लिंक या सर्वर Location:रीडायरेक्ट में बदलें, यदि आप अंतिम उपयोगकर्ता के साथ कोई इंटरैक्शन नहीं चाहते हैं। ।
जेसन

1

मुझे एक समान समस्या थी जहाँ फॉर्म एक्शन के लिए, मुझे कुछ इस तरह का था:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

बटन उपयोगकर्ता को साइट पर ले जाएगा, लेकिन क्वेरी जानकारी गायब हो गई, इसलिए उपयोगकर्ता वांछित सामग्री पृष्ठ के बजाय होम पेज पर उतरा। मेरे मामले में समाधान यह पता लगाना था कि URL को उस क्वेरी के बिना कैसे कोड किया जाए जो उपयोगकर्ता को वांछित पृष्ठ पर ले जाएगा। इस मामले में मेरा लक्ष्य एक Drupal साइट था, इसलिए जैसा कि यह /content/somethingभी पता चला कि काम किया था। मैं भी एक नोड संख्या (यानी /node/123) का इस्तेमाल कर सकता था ।


0

यदि आपको वर्कअराउंड की आवश्यकता है, क्योंकि इस फॉर्म को 3rd पार्टी सिस्टम में रखा जा सकता है, तो आप Apache mod_rewrite का उपयोग इस तरह कर सकते हैं:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

तब आपका नया रूप इस तरह दिखाई देगा:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

और अपाचे क्वेरी के लिए 3 पैरामीटर संलग्न करेगा


-3

आपका निर्माण अवैध है। आप प्रपत्र के क्रिया मान में पैरामीटर शामिल नहीं कर सकते। यदि आप यह कोशिश करते हैं तो क्या होगा यह ब्राउज़र की quirks पर निर्भर करता है। मुझे आश्चर्य नहीं होगा अगर यह एक ब्राउज़र के साथ काम करता है और दूसरे के साथ नहीं। यहां तक ​​कि अगर यह काम करने के लिए दिखाई दिया, तो मैं इस पर भरोसा नहीं करूंगा, क्योंकि ब्राउज़र का अगला संस्करण व्यवहार को बदल सकता है।

"लेकिन मैं कहता हूं कि मेरे पास क्वेरी स्ट्रिंग और छिपे हुए इनपुट में पैरामीटर हैं, मैं क्या कर सकता हूं?" आप जो कर सकते हैं वह त्रुटि को ठीक करता है। स्नाइड करने के लिए नहीं, लेकिन यह पूछने की तरह थोड़ा है, "लेकिन यह बताता है कि मेरा URL स्लैश के बजाय प्रतिशत संकेतों का उपयोग करता है, मैं क्या कर सकता हूं?" एकमात्र संभावित उत्तर है, आप URL को ठीक कर सकते हैं।


यह पूरा उत्तर तकनीकी रूप से सही है ("इसका गलत, इसलिए इसे ठीक करें") लेकिन जो भी हो उसका कोई फायदा नहीं। ओपी पहले से ही जानता है कि कुछ गलत है, और यहां पूछ रहा है कि इसे कैसे ठीक किया जाए।
जेसन

मुझे क्षमा करें, यह स्पष्ट नहीं था? "आप किसी प्रपत्र के क्रिया मान में पैरामीटर शामिल नहीं कर सकते हैं।" इसे ठीक करने के लिए, प्रपत्र के क्रिया मान से पैरामीटर निकालें।
जय

@ जय समस्या स्पष्ट रूप से है कि उपयोगकर्ता को रहने के लिए URL मापदंडों की आवश्यकता होती है, इसलिए "उन्हें हटाएं" कहना मदद के लिए नहीं है
चक ले बट

@ChuckLeButt Saying "लेकिन मुझे यह काम करने की ज़रूरत है जो काम नहीं करता है" कहने के लिए एक उपयोगी चीज नहीं है। अगर कोई मुझसे कहता है, "मैं रेडियो घुंडी घुमाता रहता हूं, लेकिन मेरी गाड़ी नहीं चलेगी", तो मैं केवल यही कह सकता हूं कि मैं यह कहना चाहूंगा, "रेडियो घुंडी को मोड़ने से गाड़ी चलती नहीं है। आपको मुड़ना होगा।" इग्निशन कुंजी और गैस पेडल पर धक्का। " उत्तर देने के लिए, "लेकिन मुझे रेडियो घुंडी घुमाकर कार को आगे बढ़ाने की जरूरत है" एक अनुत्पादक प्रतिक्रिया है। यह काम नहीं करता है। यह काम नहीं करेगा।
Jay

-3

यह Efx द्वारा उपरोक्त पोस्ट के जवाब में है:

यदि URL में पहले से ही वह संस्करण है जिसे आप बदलना चाहते हैं, तो इसे फिर से छिपे हुए फ़ील्ड के रूप में जोड़ा जाता है।

यहाँ उस कोड का एक संशोधन है जो URL में डुप्लिकेटिंग वैर को रोकने के लिए है:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}

-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

'GET' के बजाय 'POST' के लिए अनुरोध विधि बदलें।


-4

मैं आमतौर पर ऐसा कुछ लिखता हूं:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

यह काम कर रहा है, लेकिन XSS हमलों के खिलाफ अपने इनपुट को पवित्र करने के लिए मत भूलना!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.