क्या HTTPS क्वेरी स्ट्रिंग सुरक्षित है?


351

मैं एक सुरक्षित वेब आधारित एपीआई बना रहा हूं जो HTTPS का उपयोग करता है; हालाँकि, अगर मैं उपयोगकर्ताओं को एक क्वेरी स्ट्रिंग का उपयोग करके इसे कॉन्फ़िगर करने (पासवर्ड भेजने सहित) को अनुमति देता हूं तो क्या यह सुरक्षित होगा या क्या मुझे इसे POST के माध्यम से करने के लिए बाध्य करना चाहिए?

जवाबों:


453

हाँ यही है। लेकिन संवेदनशील डेटा के लिए GET का उपयोग करना कई कारणों से एक बुरा विचार है:

  • ज्यादातर HTTP रेफर रिसाव (लक्ष्य पृष्ठ में एक बाहरी छवि पासवर्ड लीक हो सकता है [1])
  • पासवर्ड सर्वर लॉग में संग्रहीत किया जाएगा (जो स्पष्ट रूप से खराब है)
  • ब्राउज़र में इतिहास कैश

इसलिए, भले ही Querystring सुरक्षित है, यह querystring पर संवेदनशील डेटा स्थानांतरित करने के लिए अनुशंसित नहीं है।

[१] हालाँकि मुझे यह ध्यान देने की आवश्यकता है कि RFC बताता है कि ब्राउज़र को HTTPS से HTTP पर रेफ़रर्स नहीं भेजने चाहिए। लेकिन इसका मतलब यह नहीं है कि एक बुरा 3 पार्टी ब्राउज़र टूलबार या एक HTTPS साइट से एक बाहरी छवि / फ्लैश इसे लीक नहीं करेगा।


4
Https से https रेफर करने वालों के बारे में क्या ? अगर मुझे https का उपयोग करके 3 पार्टी साइट से एक छवि मिल रही है? क्या ब्राउजर मेरे पिछले अनुरोध से 3 पार्टी सर्वर पर पूरे क्वेरी स्ट्रिंग भेजेगा?
Jus12

4
@ Jus12 हाँ, यह समझ में नहीं आता है, लेकिन यह है कि यह कैसे बनाया गया है।
डॉ। बुराई

2
फिर ऐसा क्यों है कि OAuth2 विनिर्देश क्वेरी पैरामीटर (URL में) में संवेदनशील डेटा भेजने की अनुशंसा नहीं करता है? भले ही यह हमेशा टीएलएस (HTTPS) का उपयोग करने की अनुशंसा करता है। Tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka

@ dr.evil क्या आप विस्तार से बता सकते हैं कि समस्या क्या है History caches in browsersया ir के लिए कुछ संदर्भ जोड़ सकते हैं?
LCJ

1
उस उत्तर को पूर्ण तिथि तक पूरा करने के लिए: securitynewspaper.com/2016/08/01/… (प्रॉक्सी पीएसी हैक HTTPS URL के अवरोधन के लिए अनुमति देता है)
टॉम

78

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

इसलिए पासवर्ड डायलॉग के लिए कम से कम पोस्ट का उपयोग करना चाहिए। साथ ही जैसा कि लिंक लिटजेक में बताया गया है कि एक GET URL आपके सर्वर लॉग में लिखे जाने की अधिक संभावना है।


48

हां , आपके क्वेरी स्ट्रिंग एन्क्रिप्ट किए जाएंगे।

इसके पीछे का कारण यह है कि क्वेरी स्ट्रिंग्स HTTP प्रोटोकॉल का एक हिस्सा है जो एक एप्लिकेशन लेयर प्रोटोकॉल है, जबकि सुरक्षा (SSL / TLS) भाग ट्रांसपोर्ट लेयर से आता है। SSL कनेक्शन पहले स्थापित किया जाता है और फिर क्वेरी पैरामीटर (जो HTTP प्रोटोकॉल से संबंधित होते हैं) सर्वर पर भेजे जाते हैं।

एसएसएल कनेक्शन स्थापित करते समय, आपका क्लाइंट क्रम में निम्नलिखित चरण करेगा। मान लीजिए कि आप example.com नामक साइट पर लॉग इन करने का प्रयास कर रहे हैं और क्वेरी मापदंडों का उपयोग करके अपनी साख भेजना चाहते हैं। आपका पूरा URL निम्न की तरह लग सकता है:

https://example.com/login?username=alice&password=12345)
  1. आपका क्लाइंट (जैसे, ब्राउज़र / मोबाइल ऐप) पहले DNS अनुरोध का उपयोग करके आपके डोमेन नाम example.comको एक आईपी पते पर हल करेगा (124.21.12.31)। उस जानकारी को क्वेरी करते समय, केवल डोमेन विशिष्ट जानकारी का उपयोग किया जाता है, अर्थात, केवलexample.com उपयोग किया जाएगा।
  2. अब, आपका क्लाइंट आईपी पते के साथ सर्वर से जुड़ने का प्रयास करेगा 124.21.12.31 से जुड़ने का प्रयास करेगा और 443 पोर्ट (एसएसएल सेवा पोर्ट डिफ़ॉल्ट HTTP पोर्ट 80 नहीं) से कनेक्ट करने का प्रयास करेगा।
  3. अब, सर्वर पर example.com अपने क्लाइंट को इसके प्रमाणपत्र भेजेगा।
  4. आपका ग्राहक प्रमाणपत्रों को सत्यापित करेगा और आपके सत्र के लिए एक साझा गुप्त कुंजी का आदान-प्रदान शुरू करेगा।
  5. सफलतापूर्वक एक सुरक्षित कनेक्शन स्थापित करने के बाद, तभी आपके क्वेरी पैरामीटर सुरक्षित कनेक्शन के माध्यम से भेजे जाएंगे।

इसलिए, आप संवेदनशील डेटा को उजागर नहीं करेंगे। हालाँकि, इस विधि का उपयोग करके HTTPS सत्र में अपनी साख भेजना सबसे अच्छा तरीका नहीं है। आपको एक अलग दृष्टिकोण के लिए जाना चाहिए।


2
लेकिन @dr द्वारा जवाब देखें। बुराई, खदान स्ट्रिंग लॉग फ़ाइलों और कैश में समाप्त हो सकती है ताकि यह सर्वर पर सुरक्षित न हो।
ज़ाफ

3
हाय ज़ैफ़, एचटीटीपीएस सुरक्षा के संदर्भ में, उद्देश्य डेटा को सुरक्षित रूप से सर्वर पर भेजना है, बीच में किसी को भी डेटा को सूँघने में सक्षम होना चाहिए। हालांकि यह संभव है, और सवाल का जवाब देता है, यह वास्तव में नियंत्रित करना मुश्किल है कि सर्वर बाद में क्या करता है। इसलिए मैंने यह भी उल्लेख किया है कि यह सही तरीका नहीं है। इसके साथ जोड़कर, आपको क्लाइंट से कभी भी पासवर्ड नहीं भेजना चाहिए। आपको हमेशा डिवाइस पर हैश करना चाहिए और सर्वर को हैश वैल्यू भेजना चाहिए।
रुचिरा रंडाना

एक सुरक्षा दृष्टिकोण से खदान स्ट्रिंग में गोपनीय जानकारी भेजना सुरक्षित नहीं है, इसे POST में भेजना सबसे अच्छा है। इसके अलावा पासवर्ड आम तौर पर सर्वर पर हैशेड होता है, क्लाइंट द्वारा नहीं। बयान "आपको क्लाइंट से कभी भी उर पासवर्ड नहीं भेजना चाहिए" उत्तर के साथ संघर्ष में है (e.g http://example.com/login?username=alice&password=12345):।
ज़ाफ

क्लाइंट पर @RuchiraRandana हैशिंग व्यर्थ है क्योंकि निजी कुंजी तब सामने के छोर से आसानी से पुनर्प्राप्त की जाती है।
जेम्स डब्ल्यू

@JamesW " निजी कुंजी तो सामने के छोर से आसानी से पुनर्प्राप्त की जाती है " क्या कुंजी?
जिज्ञासु

28

हाँ। HTTPS सत्र का पूरा पाठ SSL द्वारा सुरक्षित किया जाता है। जिसमें क्वेरी और हेडर शामिल हैं। उस संबंध में, एक POST और GET बिलकुल एक जैसा होगा।

आपकी पद्धति की सुरक्षा के लिए, उचित निरीक्षण के बिना कहने का कोई वास्तविक तरीका नहीं है।


27
ब्राउज़र और सर्वर के बीच संचार की तुलना में सुरक्षा के लिए और अधिक है
जोबॉग्स

26

SSL पहले मेजबान से जोड़ता है, इसलिए होस्ट नाम और पोर्ट नंबर को स्पष्ट पाठ के रूप में स्थानांतरित किया जाता है। जब होस्ट प्रतिक्रिया देता है और चुनौती सफल होती है, तो क्लाइंट HTTP अनुरोध को वास्तविक URL (तीसरी स्लैश के बाद कुछ भी) के साथ एन्क्रिप्ट करेगा और सर्वर पर भेज देगा।

इस सुरक्षा को तोड़ने के कई तरीके हैं।

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

आपके अनुरोध ब्राउज़र इतिहास में भी दिखाई देंगे। उपयोगकर्ताओं को साइट को बुकमार्क करने के लिए लुभाया जा सकता है। कुछ उपयोगकर्ताओं के पास बुकमार्क सिंक टूल इंस्टॉल किए गए हैं, इसलिए पासवर्ड डेली.साइस या किसी अन्य स्थान पर समाप्त हो सकता है।

अंत में, हो सकता है कि किसी ने आपके कंप्यूटर को हैक किया हो और कीबोर्ड लॉगर या स्क्रीन स्क्रैपर (और ट्रोजन हॉर्स टाइप के बहुत सारे वायरस करते हों) इंस्टॉल किए हों। चूंकि पासवर्ड सीधे स्क्रीन पर दिखाई देता है (जैसा कि पासवर्ड डायलॉग में "*" के विपरीत है), यह एक और सुरक्षा छेद है।

निष्कर्ष: जब सुरक्षा की बात आती है, तो हमेशा पीटा मार्ग पर भरोसा करें। वहाँ सिर्फ इतना है कि आप नहीं जानते, नहीं सोचेंगे और जो आपकी गर्दन को तोड़ देगा।


3
"ब्राउज़र अभी भी प्रॉक्सी से बात करेगा" बिल्कुल सच नहीं है, यह ब्राउज़र को एक वैध प्रमाण पत्र के साथ प्रस्तुत करने की आवश्यकता होगी जो प्रॉक्सी केवल तभी उत्पन्न कर सकता है जब उसके पास सीए ट्रस्ट पर भरोसा करता है।
पीटर


10

मैं के बारे में बयान से सहमत नहीं है [...] HTTP संदर्भदाता रिसाव (लक्ष्य पेज में एक बाहरी छवि पासवर्ड लीक हो सकता है) में स्लाव की प्रतिक्रिया

HTTP 1.1 RFC स्पष्ट रूप से बताता है :

यदि ग्राहक एक सुरक्षित प्रोटोकॉल के साथ स्थानांतरित किया गया था, तो ग्राहक एक (गैर-सुरक्षित) HTTP अनुरोध में एक रेफर हेडर फ़ील्ड शामिल नहीं कर सकता।

वैसे भी, सर्वर लॉग और ब्राउज़र इतिहास क्वेरी स्ट्रिंग में संवेदनशील डेटा नहीं डालने के लिए पर्याप्त कारणों से अधिक है।


2
वहाँ वह शब्द 'फिर से' होना चाहिए। क्या आप अपने पासवर्ड के साथ हर ब्राउज़र के हर संस्करण पर भरोसा करेंगे?
जोबोग्स 11

1
यह वास्तव में GST बनाम POST से कैसे संबंधित है? यदि आप HTTPS से अधिक POST का उपयोग कर रहे हैं तो "हर ब्राउज़र का हर संस्करण" सुरक्षित रहेगा?
अर्नआउट नोव

2
इसके अलावा, HTTPS वेब पेज HTTPS से अधिक बाहरी छवि को पुन: प्राप्त कर सकता है - जिस स्थिति में, ब्राउज़र SHOULD में रेफर हेडर शामिल होता है, और इस तरह आपका पासवर्ड सामने आता है ...
AviD

3
@Arnout: कृपया इस RFC को पढ़ें जो आपको बताता है कि SHOULD का क्या मतलब नहीं है: ietf.org/rfc/rfc2119.txt यह इसके समान नहीं होना चाहिए , इसलिए आपके द्वारा उद्धृत किया गया भाग वास्तव में निष्क्रिय नहीं है और ब्राउज़र एजेंट अभी भी एक रेफ़र शामिल कर सकते हैं। HTTP को।
एंडी

8

हां, जब से आप HTTPS कनेक्शन स्थापित करते हैं, हर पल सुरक्षित रहता है। SSL के रूप में POST के रूप में क्वेरी स्ट्रिंग (GET) भेजा जाता है।


-4

आप कुछ नमक के साथ MD5 हैश परम के रूप में पासवर्ड भेज सकते हैं। ऑर्ट के लिए सर्वर साइड पर इसकी तुलना करें।


11
MD5 पासवर्ड के लिए उपयुक्त हैश फ़ंक्शन नहीं है।
slawek

1
हैशटैड या क्लियरटेक्स्ट में, जीईटी मापदंडों के भीतर पासवर्ड भेजने के लिए यह बुरा अभ्यास है। कृपया स्पष्टीकरण के लिए शीर्ष मतदान जवाब देखें। Aaaand ... MD5 का उपयोग कहीं भी नहीं किया जाना चाहिए ...
थॉमस

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