HTML फॉर्म की एक्शन विशेषता के लिए खाली URL का उपयोग करना एक अच्छा अभ्यास है? (कार्रवाई = "")


279

मुझे आश्चर्य हो रहा है कि क्या कोई वर्तमान पृष्ठ पर वापस पोस्ट करने के लिए रिक्त HTML प्रपत्र क्रियाओं का उपयोग करने के लिए "सर्वोत्तम अभ्यास" प्रतिक्रिया दे सकता है।

वहाँ एक पोस्ट पूछ रहा है कि एक खाली HTML फॉर्म एक्शन यहाँ क्या करता है और इस तरह के कुछ पृष्ठ यह सुझाव देते हैं कि यह ठीक है, लेकिन मैं जानना चाहूंगा कि लोग क्या सोचते हैं।


7
"सर्वोत्तम प्रथाओं" टैग का सुझाव इस पर लागू किया जाता है।
विल मॉर्गन

दोगुनी पुष्टि करने के लिए, क्रिया को खाली छोड़ दें, या बस किसी कार्रवाई का उल्लेख न करें (जैसे <form name="xyz" >)। यह अपने आप कार्रवाई प्रस्तुत करेगा।
lwpro2

11
एक्शन विशेषता को शामिल नहीं करने पर पेज को खुलने वाले क्लिकरैकिंग हमलों को खोलता है , जैसे कि एक हमलावर जो आपके पेज को एक iframe में लपेटता है और iframe URL में एक फॉर्म फ़ील्ड के समान नाम के साथ एक क्वेरी परम शामिल है। जब फ़ॉर्म जमा किया जाता है, तो क्वेरी मान डेटाबेस में डाला जाता है, इसलिए उपयोगकर्ता की पहचान करने वाली जानकारी (ईमेल, पता, आदि) से समझौता किया गया है।
पॉल स्वेट्टे

तो, वर्तमान पृष्ठ पर फ़ॉर्म सबमिट करने का वैध, सुरक्षित तरीका क्या है?
कोस्टा

जवाबों:


268

सबसे अच्छी बात यह है कि आप एक्शन विशेषता को पूरी तरह से छोड़ सकते हैं। यदि आप इसे छोड़ देते हैं, तो प्रपत्र दस्तावेज़ के पते पर सबमिट किया जाएगा, अर्थात उसी पृष्ठ पर।

इसे खाली छोड़ना भी संभव है, और HTML के फ़ॉर्म सबमिशन एल्गोरिथ्म को लागू करने वाला कोई भी ब्राउज़र इसे दस्तावेज़ के पते के बराबर ही मानेगा, जो कि मुख्य रूप से ऐसा करता है क्योंकि वर्तमान में ब्राउज़र कैसे काम करते हैं:

8.कार्रवाई को सबमिट करने वाले तत्व की कार्रवाई होने दें

9.यदि कार्रवाई खाली स्ट्रिंग है, तो कार्रवाई को दस्तावेज़ का पता होने दें

नोट: यह कदम RFC 3986 का एक विलक्षण उल्लंघन है, जिसके लिए यहां आधार URL प्रसंस्करण की आवश्यकता होगी। यह उल्लंघन विरासत सामग्री के साथ संगतता की इच्छा से प्रेरित है। [RFC3986]

यह निश्चित रूप से सभी वर्तमान ब्राउज़रों में काम करता है, लेकिन कुछ पुराने ब्राउज़रों में उम्मीद के मुताबिक काम नहीं कर सकता है ( " ब्राउज़र एक खाली कार्रवाई =" "विशेषता " के साथ अजीब चीजें करते हैं ), यही वजह है कि लेखक लेखकों को इसे खाली छोड़ने से दृढ़ता से हतोत्साहित करता है :

actionऔर formactionसामग्री गुण, अगर निर्दिष्ट, कि एक है एक मान होना चाहिए वैध गैर खाली यूआरएल संभावित रिक्त स्थान से घिरा हुआ


12
संभवत: यह अपने जवाब (अपने लगभग तीन साल कर दिया गया है), लेकिन आज के रूप में, एचटीएमएल 5 की अनुमति नहीं है के बाद से बदल गया है action=""-see मेरा उत्तर ...
derobert

2
@derobert धन्यवाद यह शायद नहीं बदला था। मैंने अपने उत्तर को बेहतर तरीके से दर्शाया है कि कल्पना क्या कहती है।
व्यापारी

73

दरअसल, वर्तमान एचटीएमएल 5 ड्राफ्ट का फॉर्म सबमिशन सबमिशन अनुमति नहीं देता है action=""। यह कल्पना के खिलाफ है।

actionऔर formactionसामग्री गुण, अगर निर्दिष्ट, यह एक मान्य है एक मान होना चाहिए गैर खाली यूआरएल संभावित रिक्त स्थान से घिरा हुआ। (महत्व दिया)

व्यापारी के उत्तर में उद्धृत भाग , कार्यान्वयन पर एक आवश्यकता है , लेखक नहीं । लेखकों को लेखक की आवश्यकताओं का पालन करना चाहिए। इस विनिर्देश को पढ़ने के लिए उद्धरण के लिए :

विशेष रूप से, उत्पादकों पर लागू होने वाली अनुरूपता आवश्यकताएं हैं, उदाहरण के लिए लेखक और उनके द्वारा बनाए गए दस्तावेज़, और उपभोक्ताओं के लिए लागू अनुरूपता आवश्यकताएँ हैं, उदाहरण के लिए वेब ब्राउज़र। उन्हें इस बात से अलग किया जा सकता है कि उन्हें क्या आवश्यकता है: एक निर्माता पर एक आवश्यकता बताई गई है, जबकि एक उपभोक्ता पर एक आवश्यकता बताती है कि सॉफ्टवेयर को कैसे कार्य करना है।

HTML4 से परिवर्तन - जिसने खाली URL की अनुमति दी थी - क्योंकि " ब्राउज़र एक खाली action=""विशेषता के साथ अजीब चीजें करते हैं "। परिवर्तन के कारण को ध्यान में रखते हुए, शायद यह एचटीएमएल 4 में भी ऐसा करने के लिए सबसे अच्छा नहीं है।


क्या यह actionपूरी तरह से विशेषता की अनुपस्थिति की अनुमति देता है इंगित करने के लिए कि प्रपत्र को दस्तावेज़ के पते पर प्रस्तुत करना चाहिए? ऐसा लगता है, क्योंकि यह कहता है, "यदि निर्दिष्ट है।"
केरिक

2
@ केरिक हां, मेरा मानना ​​है कि HTML5 पूरी तरह से एक्शन विशेषता को छोड़ने की अनुमति देता है, और इसे खाली स्ट्रिंग में डिफॉल्ट करता है। HTML4 ने नहीं किया, यह आवश्यकतानुसार कार्रवाई को निर्दिष्ट करता है।
derobert

मैं @Kerrick से सहमत हूं, यह एक्शन विशेषता को छोड़ देने की अनुमति है। वर्तमान एचटीएमएल 5 प्रारूप में पढ़ना, ऐसा लगता है कि खाली स्ट्रिंग की अनुमति नहीं है लेकिन विशेषता की अनुपस्थिति की अनुमति है। लेकिन किसी भी मामले में, संगतता कारणों के लिए, मैं आपको "एक्शन" विशेषता को हमेशा शामिल करने की सलाह देता हूं और इसे एक वैध गैर-रिक्त URL से भर देता हूं (अच्छी प्रैक्टिस हमेशा सबसे अच्छा तरीका है)।
सेरफर 2

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

18

एक्शन विशेषता को शामिल नहीं करने पर पेज को खुलने वाले क्लिकरैकिंग हमलों तक खोल दिया जाता है , जिसमें कुछ सरल कदम शामिल होते हैं:

  • एक हमलावर आइफ्रेम में आपके पेज को लपेटता है
  • Iframe URL में प्रपत्र फ़ील्ड के समान नाम के साथ एक क्वेरी परम शामिल है
  • जब फ़ॉर्म सबमिट किया जाता है, तो क्वेरी मान डेटाबेस में डाला जाता है
  • उपयोगकर्ता की पहचान करने वाली जानकारी (ईमेल, पता आदि) से समझौता किया गया है

संदर्भ


2
क्या iframe URL में GET पैरामीटर नहीं हैं, जबकि आमतौर पर POST का उपयोग करके फॉर्म सबमिट किए जाते हैं? तो अगर साइट केवल POST मापदंडों से संबंधित है तो यह एक समस्या नहीं होनी चाहिए? कम से कम मैं आमतौर पर PHP में $ _POST सरणी का उपयोग केवल प्रसंस्करण के रूपों के दौरान करता हूं।
कैलमरीस

2
@ कैलेमरियस हां, इससे बचने $_POSTके $_REQUESTलिए उपयोग करें। यदि फ्रेमवर्क कोड उपयोग करता है $_REQUEST, तो एक iframe बस्टर का उपयोग करें ।
पॉल स्वेट्टे

17

यह HTML5 के साथ मान्य होगा।

<form action="#">

4
मैंने इसे आज़माया नहीं है, लेकिन वैचारिक रूप से प्रस्तुत करने के बाद पृष्ठ के शीर्ष पर स्क्रॉल नहीं करेगा?
मैट मिशेल

2
क्या आप उपयोग नहीं कर सकते action="."?
s427

3
कार्रवाई = "?" अच्छा भी काम करता है। यह स्ट्रिंग डेटा के बिना वर्तमान पृष्ठ को मान्य और इंगित करता है।
क्रिस ब्रॉस्की

5
action="."सामान्य मामले के लिए एक बुरा विचार है। जैसे URL example.com/loginको केवल मैप किया जाता है example.com/
टॉरस्टेन ब्रॉन्गर

1
यदि उपयोगकर्ता पृष्ठ के शीर्ष पर स्क्रॉल करना चाहता है तो यह उत्तर केवल मान्य है।
बट्स

9

एचटीएमएल 5 में action=""ऐसा नहीं किया गया है। बुरा व्यवहार।

यदि इसके बजाय आप पूरी तरह से कार्रवाई को पूरी तरह से नकार देते हैं, तो यह डिफ़ॉल्ट रूप से उसी पृष्ठ पर सबमिट हो जाएगा, मेरा मानना ​​है कि यह सबसे अच्छा अभ्यास है:

<form>This will submit to the current page</form>

यदि आप php का उपयोग करके फ़ॉर्म को रोक रहे हैं तो आप निम्नलिखित पर विचार करना चाह सकते हैं। इस बारे में यहां और पढ़ें।

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

वैकल्पिक रूप से आप यह #ध्यान में रख सकते हैं कि यह एक एंकर की तरह काम करेगा और पृष्ठ के शीर्ष पर स्क्रॉल करेगा।

<form action="#">

समझना चाहेंगे कि क्यों किसी ने इस जवाब को वोट दिया है?
बट्स

आप एक्शन विशेषता पर काम करते हैं, क्या लिंक पर खुले हुए पृष्ठ पर अभी भी कारनामे खुले हैं?
रिचर्ड यंग

@RichardYoung क्षमा करें, मुझे आपके प्रश्न की समझ नहीं है। कृपया rephrase।
मगर नहीं

1
$ _SERVER ["PHP_SELF"] चर का उपयोग हैकर्स द्वारा किया जा सकता है। यदि आपके पृष्ठ में PHP_SELF का उपयोग किया जाता है तो एक उपयोगकर्ता स्लैश (/) और फिर कुछ क्रॉस साइट स्क्रिप्टिंग (XSS) कमांड को निष्पादित करने के लिए दर्ज कर सकता है। यदि आप कार्रवाई विशेषता छोड़ देते हैं, तो क्या आप अभी भी इसके प्रति संवेदनशील हैं?
रिचर्ड यंग

हाँ तुम हो। कार्रवाई की विशेषता को ग्राहक पक्ष में वापस जोड़ा जा सकता है और पसंद का कोई भी मूल्य दिया जा सकता है। हालाँकि htmlspecialchars()फ़ंक्शन का उपयोग करना लोगों को आपके खिलाफ आपकी php स्क्रिप्ट का उपयोग करने से रोकता है।
बट्स

4

मैं आमतौर पर एक्शन = "" का उपयोग करता हूं, जो कि एक्सएचटीएमएल वैध है और यूआरएल में जीईटी डेटा को बरकरार रखता है।


4
शायद ही, लेकिन उदाहरण के लिए, मेरे मंच में, मेरे पास URL होगा: thread.php? Id = 12 & पेज = 6 और टिप्पणियों को जोड़ने के लिए पृष्ठ के निचले भाग में एक POST फ़ॉर्म है, और मुझे GET डेटा की आवश्यकता है ताकि PHP जानता है कि टिप्पणी को जोड़ने के लिए कौन सा धागा है।
जुडलिंग जू

20
फॉर्म के लिए GET डिफ़ॉल्ट विधि है - यह शायद ही कोई बुरी चीज है; ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
रूपों में मिलता है का उपयोग करना है एक बुरी बात। यदि उपयोगकर्ता पृष्ठ सबमिट करने के बाद पुनः लोड करता है, तो अनपेक्षित परिणाम हो सकते हैं। हालांकि अगर कोई POST का उपयोग किया जाता है, तो ब्राउज़र उसी डेटा को फिर से सबमिट करने के बारे में चेतावनी देगा।
को शेपर्ड

22
@WillSheppard मैं असहमत हूं। आप ऐसा कंबल बयान नहीं कर सकते। यह सब इस पर निर्भर करता है कि फॉर्म क्या करता है। आपको किसी भी कार्य के लिए POST का उपयोग करना चाहिए (उदाहरण के लिए एक मंच में एक नई पोस्ट सम्मिलित करना), लेकिन बाकी सब के लिए GET (उदाहरण के लिए खोज बॉक्स या नेविगेशन के लिए फ़ॉर्म का उपयोग करना)। एक सफल POST के बाद, स्क्रिप्ट को उपयोगकर्ता को डेटा को फिर से सबमिट करने से रोकने के लिए ब्राउज़र को पुनर्निर्देशित करना चाहिए।
माइक

3
PS सभी ब्राउज़र उपयोगकर्ता को POST डेटा (उदाहरण के लिए ओपेरा)
माइक

4

मुझे लगता है कि यह स्पष्ट रूप से बताता है कि फॉर्म कहां हैं। यदि आप पूरी तरह से सुरक्षित होना चाहते हैं, तो वही URL दर्ज करें जो क्रिया विशेषता में है यदि आप चाहते हैं कि वह स्वयं को वापस सबमिट करे। हालाँकि मुख्यधारा के ब्राउज़र ""उसी पृष्ठ का मूल्यांकन करते हैं, आप गैर-मुख्यधारा ब्राउज़रों की गारंटी नहीं दे सकते।

और निश्चित रूप से, GET डेटा जैसे पूरे URL जिसमें जूडलिंग इंगित करता है।


2

महज प्रयोग करें

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

यह HTML5 मानकों का उल्लंघन नहीं करता है।


मैं नीचे नहीं गया, लेकिन आपका तरीका सभी getपरों को छोड़ देगा । इस यूआरएल पर एक प्रपत्र टूट जाएगा example.com/update_user?user_id=1क्योंकि फार्म के लिए प्रस्तुत करेगाexample.com/update_user?
Vikki

1

जब मैं क्लासिक एएसपी के साथ काम करता था तो मैं यह बहुत करता था। आमतौर पर मैंने इसका उपयोग तब किया जब इनपुट के लिए सर्वर-साइड सत्यापन कुछ प्रकार की आवश्यकता थी (AJAX के दिनों से पहले)। मुख्य ड्रा बैक मैं देख रहा हूं कि यह फ़ाइल स्तर पर प्रस्तुति से प्रोग्रामिंग लॉजिक को अलग नहीं करता है।


1
क्यों नहीं? मुझे लगता है कि यह जुड़ा नहीं है। मेरे पास प्रपत्र को उसी पृष्ठ पर पोस्ट करने और नियंत्रक और दृश्य के उचित पृथक्करण के साथ इस पृष्ठ का निर्माण हो सकता है।
मार्कस

1

मैं बिल्कुल भी एक्शन विशेषता निर्दिष्ट नहीं करता। यह वास्तव में है कि कैसे मेरे ढांचे को डिज़ाइन किया गया है सभी पेज एक ही पते पर सटीक रूप से सबमिट किए जाते हैं। लेकिन आज मुझे समस्या का पता चला। कभी-कभी मैं कुछ बैकग्राउंड कॉल करने के लिए एक्शन विशेषता मूल्य उधार लेता हूं (मुझे लगता है कि कुछ लोग उन्हें AJAX नाम देते हैं)। तो मैंने पाया कि यदि एक्शन विशेषता निर्दिष्ट नहीं की गई थी तो IE एक्शन विशेषता मान को खाली रखता है। मेरी समझ में यह थोड़ा अजीब है, क्योंकि यदि कोई एक्शन विशेषता निर्दिष्ट नहीं की जाती है, तो जावास्क्रिप्ट समकक्ष को कम से कम अपरिभाषित होना चाहिए। वैसे भी, मेरी बात इससे पहले कि आप सबसे अच्छा अभ्यास चुनें, आपको अधिक संदर्भ को समझने की आवश्यकता है, जैसे आप जावास्क्रिप्ट में विशेषता का उपयोग करेंगे या नहीं।

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