दिलचस्प पोस्ट
सी # "आखिरकार" क्या हमेशा निष्पादित करता है? GetAttribute () और getParameter () के बीच का अंतर उद्देश्य-सी के साथ पोस्ट मल्टीपार्ट / फॉर्म-डेटा Bitwise shift (bit-shift) ऑपरेटरों और वे कैसे काम करते हैं? एंड्रॉइड डेवलपर कंसोल पर एप्लिकेशन सूची से एप्लिकेशन को कैसे निकाला जाए सभी चित्रों के साथ एक सरणी कैसे प्राप्त करें? आप कैसे मानते हैं कि कुछ अपवाद JUnit 4 परीक्षणों में फेंका गया है? ट्रिगर ईवेंट जब उपयोगकर्ता विशिष्ट तत्व तक स्क्रॉल करता है – jQuery के साथ जेएस दिनांक ऑब्जेक्ट से YYYYMMDD प्रारूप में स्ट्रिंग प्राप्त करें? रुबी के डबल-बृहदान्त्र `::` क्या है? एंड्रॉइड स्टूडियो पर प्रोजेक्ट का नाम बदलें event.returnValue नापसंद है इसके बजाय मानक event.preventDefault () का उपयोग करें प्रोग्रामर एंड्रॉइड फोन के फोन नंबर प्राप्त करें विज़ुअल स्टूडियो के साथ गिट का इस्तेमाल करना tensorflow tf.nn.softmax और tf.nn.softmax_cross_entropy_with_logits के बीच का अंतर

फॉर्म-आधारित वेबसाइट प्रमाणीकरण के लिए निश्चित मार्गदर्शक

वेबसाइटों के लिए फ़ॉर्म-आधारित प्रमाणीकरण

हमारा मानना ​​है कि स्टैक ओवरफ़्लो को केवल विशिष्ट तकनीकी प्रश्नों के लिए एक संसाधन नहीं होना चाहिए, बल्कि आम समस्याओं पर भिन्नताएं हल करने के सामान्य निर्देशों के लिए भी। इस तरह के प्रयोग के लिए "वेबसाइटों के लिए फ़ॉर्म आधारित प्रमाणीकरण" एक अच्छा विषय होना चाहिए।

इसमें विषयों जैसे:

  • लॉग इन कैसे करें
  • लॉग इन कैसे बने रहें
  • कुकीज़ प्रबंधित करना (सुझाई गई सेटिंग सहित)
  • SSL / HTTPS एन्क्रिप्शन
  • पासवर्ड कैसे स्टोर करें
  • गुप्त प्रश्नों का उपयोग करना
  • भूल गए उपयोगकर्ता नाम / पासवर्ड की कार्यक्षमता
  • क्रॉस-साइट अनुरोध फर्जियों ( सीएसआरएफ) को रोकने के लिए नॉन का इस्तेमाल
  • OpenID
  • "मुझे याद रखें" चेकबॉक्स
  • उपयोगकर्ता नाम और पासवर्ड के ब्राउज़र स्वत: पूर्ण
  • सीक्रेट यूआरएल (पब्लिक यूआरएल डाइजेस्ट द्वारा संरक्षित)
  • पासवर्ड की ताकत जांचना
  • ई-मेल सत्यापन
  • और फॉर्म आधारित प्रमाणीकरण के बारे में बहुत कुछ

इसमें ऐसी चीज़ों को शामिल नहीं करना चाहिए:

  • भूमिकाएं और प्राधिकरण
  • HTTP मूलभूत प्रमाणीकरण

कृपया हमें इससे मदद करें:

  1. उप-विषयक सुझाव देना
  2. इस विषय के बारे में अच्छा लेख प्रस्तुत करना
  3. आधिकारिक उत्तर संपादित करना

वेब के समाधान से एकत्रित समाधान "फॉर्म-आधारित वेबसाइट प्रमाणीकरण के लिए निश्चित मार्गदर्शक"

निश्चित लेख

क्रेडेंशियल भेज रहा है

क्रेडेंशियल्स को 100% सुरक्षित रूप से भेजने का एकमात्र व्यावहारिक तरीका एसएसएल का उपयोग कर रहा है । हैश करने के लिए जावास्क्रिप्ट का प्रयोग पासवर्ड सुरक्षित नहीं है। क्लाइंट साइड पासवर्ड हैशिंग के लिए सामान्य नुकसान:

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

एसआरपी नामक एक और सुरक्षित विधि है, लेकिन यह पेटेंट है (हालांकि यह स्वतंत्र रूप से लाइसेंस प्राप्त है ) और उपलब्ध कुछ अच्छे कार्यान्वयन उपलब्ध हैं।

भंडारण पासवर्ड

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

अपने आप से भी हताश असुरक्षित हैं। उदाहरण के लिए, समान पासवर्ड का मतलब समान हैश – यह हैश लुकअप तालिकाओं को एक बार में बहुत सारे पासवर्ड को क्रैक करने का प्रभावी तरीका बनाता है इसके बजाय, नमकीन हैश को स्टोर करें एक नमक हैशिंग से पहले पासवर्ड में जोड़ा गया एक स्ट्रिंग है – प्रति उपयोगकर्ता एक अलग (यादृच्छिक) नमक का उपयोग करें नमक एक सार्वजनिक मूल्य है, इसलिए आप उन्हें डेटाबेस में हैश के साथ संग्रहीत कर सकते हैं। इस बारे में और जानने के लिए यहां देखें

इसका मतलब है कि आप उपयोगकर्ता को अपना भूल पासवर्ड नहीं भेज सकते (क्योंकि आपके पास केवल हैश है)। उपयोगकर्ता के पासवर्ड को रीसेट न करें जब तक कि आपने उपयोगकर्ता को प्रमाणित न किया हो (उपयोगकर्ता को यह साबित करना होगा कि वे संग्रहीत (और मान्य) ईमेल पते पर भेजे गए ईमेल को पढ़ने में सक्षम हैं।)

सुरक्षा प्रश्न

सुरक्षा प्रश्न असुरक्षित हैं – उनका उपयोग करने से बचें क्यूं कर? कोई भी सुरक्षा प्रश्न करता है, एक पासवर्ड बेहतर होता है भाग III पढ़ें : @ जेन्स रोलैंड में गुप्त प्रश्नों का प्रयोग इस विकी में उत्तर दें ।

सत्र कुकीज

उपयोगकर्ता लॉग इन करने के बाद, सर्वर उपयोगकर्ता को एक सत्र कुकी भेजता है। सर्वर कुकी से उपयोगकर्ता नाम या आईडी को पुनः प्राप्त कर सकता है, लेकिन कोई भी ऐसा कुकी नहीं बना सकता है (TODO व्याख्यान तंत्र)

कुकीज़ का अपहरण किया जा सकता है : वे केवल ग्राहक के बाकी मशीन और अन्य संचार के रूप में सुरक्षित हैं। वे डिस्क से पढ़ा जा सकता है, नेटवर्क ट्रैफ़िक में सूँघा, क्रॉस-साइट स्क्रिप्टिंग हमले द्वारा उठाए गए, जहरीले DNS से ​​फ़िश किया गया, जिससे क्लाइंट गलत कुकीज़ पर अपनी कुकी भेजता है। लगातार कुकीज न भेजें कुकियों को क्लाइंट सत्र के अंत में समाप्त हो जाना चाहिए (ब्राउज़र बंद या अपने डोमेन को छोड़कर)

यदि आप अपने उपयोगकर्ताओं को स्वयंोलॉग करना चाहते हैं, तो आप एक निरंतर कुकी सेट कर सकते हैं, लेकिन यह एक पूर्ण-सत्र कुकी से अलग होना चाहिए। आप एक अतिरिक्त ध्वज सेट कर सकते हैं जिस पर उपयोगकर्ता ने स्वत: लॉग इन किया है, और संवेदनशील कार्यों के लिए असली के लिए लॉगिन करने की आवश्यकता है। यह शॉपिंग साइट्स में लोकप्रिय है जो आपको निर्बाध, व्यक्तिगत खरीदारी अनुभव प्रदान करना चाहते हैं, लेकिन अभी भी आपके वित्तीय विवरणों की रक्षा करते हैं। उदाहरण के लिए, जब आप अमेज़ॅन पर वापस लौटते हैं, तो वे आपको एक पृष्ठ दिखाते हैं जैसे आप लॉग-इन कर रहे हैं, लेकिन जब आप ऑर्डर करने के लिए जाते हैं (या अपना शिपिंग पता, क्रेडिट कार्ड आदि बदलें), तो वे आपको इसकी पुष्टि करने के लिए कहते हैं आपका पासवर्ड।

दूसरी ओर बैंकों और क्रेडिट कार्ड जैसे वित्तीय वेब साइट्स में केवल संवेदनशील डेटा है और ऑटो-लॉन्ग या कम-सुरक्षा मोड की अनुमति नहीं दी जानी चाहिए।

बाहरी संसाधनों की सूची

  • वेब पर क्लाइंट प्रमाणीकरण के क्या और क्या नहीं (पीडीएफ)
    कई महान युक्तियों के साथ 21 पृष्ठ शैक्षणिक लेख
  • YC से पूछें: उपयोगकर्ता प्रमाणीकरण के लिए सर्वोत्तम अभ्यास
    इस विषय पर फोरम चर्चा
  • आप संभवतः पासवर्ड को गलत तरीके से संग्रहित कर रहे हैं
    पासवर्ड संग्रह करने के बारे में परिचयात्मक लेख
  • चर्चा: कोडिंग डरावना: आप शायद पासवर्ड को गलत तरीके से संग्रहित कर रहे हैं
    कोडिंग डरावनी लेख के बारे में फोरम चर्चा।
  • किसी डेटाबेस में कभी भी पासवर्ड न रखें!
    डाटाबेस में पासवर्ड के भंडारण के बारे में एक चेतावनी।
  • पासवर्ड क्रैकिंग
    कई पासवर्ड हैशिंग योजनाओं की कमजोरियों पर विकिपीडिया लेख।
  • इंद्रधनुष टेबल्स के साथ पर्याप्त: सुरक्षित पासवर्ड योजनाओं के बारे में आपको क्या पता होना चाहिए
    इंद्रधनुष तालिकाओं के बारे में चर्चा और उनके खिलाफ कैसे बचाव करना है, और अन्य धागे के खिलाफ। व्यापक चर्चा शामिल है

सबसे पहले, एक मजबूत चेतावनी है कि यह जवाब इस सटीक प्रश्न के लिए सबसे उपयुक्त नहीं है। यह निश्चित रूप से शीर्ष उत्तर नहीं होना चाहिए!

मैं आगे जाकर भविष्य में प्रमाणीकरण के बेहतर दृष्टिकोण के लिए एक अपग्रेड पथ खोजने की भावना में मोज़िला के प्रस्तावित ब्राउज़रआईडी (या शायद अधिक सटीक, सत्यापित ईमेल प्रोटोकॉल ) का उल्लेख करूँगा ।

मैं इसे इस तरीके से संक्षेप दूँगा:

  1. मोज़िला ऐसे गुणों के साथ एक गैर-लाभकारी है, जो इस समस्या के अच्छे समाधान खोजने के साथ अच्छी तरह से संरेखित होते हैं।
  2. आज वास्तविकता यह है कि अधिकांश वेबसाइटें फॉर्म-आधारित प्रमाणीकरण का उपयोग करती हैं
  3. फॉर्म-आधारित प्रमाणीकरण में एक बड़ी कमी है, जो फ़िशिंग का खतरा बढ़ जाता है। उपयोगकर्ता को अपने उपयोगकर्ता एजेंट (ब्राउज़र) द्वारा नियंत्रित क्षेत्र के बजाय किसी दूरस्थ इकाई द्वारा नियंत्रित क्षेत्र में संवेदनशील जानकारी दर्ज करने के लिए कहा जाता है।
  4. चूंकि ब्राउज़रों पर भरोसेमंद भरोसेमंद (एक उपयोगकर्ता एजेंट का पूरा विचार उपयोगकर्ता की ओर से कार्य करना है), इसलिए वे इस स्थिति को बेहतर बनाने में मदद कर सकते हैं।
  5. प्राथमिक बल यहाँ प्रगति की तैनाती तैनाती गतिरोध है समाधान उन कदमों में विघटित होना चाहिए जो अपने आप में कुछ वृद्धिशील लाभ प्रदान करते हैं।
  6. इंटरनेट बुनियादी ढांचे में बनाया गया पहचान को व्यक्त करने के लिए सरल विकेन्द्रीकृत विधि डोमेन नाम है
  7. पहचान व्यक्त करने के दूसरे स्तर के रूप में, प्रत्येक डोमेन अपने स्वयं के खातों का प्रबंधन करता है।
  8. प्रपत्र "account @ domain" संक्षिप्त और प्रोटोकॉल और यूआरआई योजनाओं की एक विस्तृत श्रृंखला द्वारा समर्थित है। इस तरह के एक पहचानकर्ता, निश्चित रूप से, सबसे अधिकतर एक ईमेल पते के रूप में मान्यता प्राप्त है।
  9. ई-मेल प्रदाता पहले से ही डी-वास्तविक प्राथमिक पहचान प्रदाता ऑनलाइन हैं वर्तमान पासवर्ड रीसेट प्रवाह आमतौर पर आप एक खाते पर नियंत्रण लेते हैं यदि आप यह साबित कर सकते हैं कि आप उस खाते के संबद्ध ईमेल पते को नियंत्रित करते हैं।
  10. डोमेन बी को साबित करने की प्रक्रिया को सुव्यवस्थित करने के लिए, सार्वजनिक एपी क्रिप्टोग्राफी के आधार पर सत्यापित ईमेल प्रोटोकॉल को एक सुरक्षित विधि प्रदान करने का प्रस्ताव था, ताकि डोमेन ए पर खाता हो।
  11. उन ब्राउज़रों के लिए जो सत्यापित ईमेल प्रोटोकॉल (वर्तमान में सभी) का समर्थन नहीं करते हैं, मोज़िला एक शिम प्रदान करता है जो क्लाइंट-साइड जावास्क्रिप्ट कोड में प्रोटोकॉल लागू करता है।
  12. ईमेल सेवाओं के लिए जो सत्यापित ईमेल प्रोटोकॉल का समर्थन नहीं करते हैं, प्रोटोकॉल तृतीय पक्षों को एक विश्वसनीय मध्यस्थ के रूप में कार्य करने की अनुमति देता है, यह कहते हुए कि वे किसी उपयोगकर्ता के खाते के स्वामित्व को सत्यापित कर चुके हैं। ऐसे तीसरे पक्ष की बड़ी संख्या के लिए वांछनीय नहीं है; यह क्षमता केवल अपग्रेड पथ की अनुमति के लिए है, और यह बहुत पसंदीदा है कि ईमेल सेवाओं ने ये दावा स्वयं प्रदान किए हैं।
  13. मोज़िला ऐसी भरोसेमंद तृतीय पक्ष के रूप में कार्य करने के लिए अपनी सेवा प्रदान करता है Service Providers (that is, Relying Parties) implementing the Verified Email Protocol may choose to trust Mozilla's assertions or not. Mozilla's service verifies users' account ownership using the conventional means of sending an email with a confirmation link.
  14. Service Providers may, of course, offer this protocol as an option in addition to any other method(s) of authentication they might wish to offer.
  15. A big user interface benefit being sought here is the “identity selector”. When a user visits a site and chooses to authenticate, their browser shows them a selection of email addresses (“personal”, “work”, “political activism”, etc.) they may use to identify themselves to the site.
  16. Another big user interface benefit being sought as part of this effort is helping the browser know more about the user's session – who they're signed in as currently, primarily – so it may display that in the browser chrome.
  17. Because of the distributed nature of this system, it avoids lock-in to major sites like Facebook, Twitter, Google, etc. Any individual can own their own domain and therefore act as their own identity provider.

This is not strictly “form-based authentication for websites”. But it is an effort to transition from the current norm of form-based authentication to something more secure: browser-supported authentication.

I just thought I'd share this solution that I found to be working just fine.

I call it the Dummy Field (though I haven't invented this so don't credit me).

In short: you just have to insert this into your <form> and check for it to be empty at when validating:

 <input type="text" name="email" style="display:none" /> 

The trick is to fool a bot into thinking it has to insert data into a required field, that's why I named the input "email". If you already have a field called email that you're using you should try naming the dummy field something else like "company", "phone" or "emailaddress". Just pick something you know you don't need and what sounds like something people would normally find logical to fill in into a web form. Now hide the input field using CSS or JavaScript/jQuery – whatever fits you best – just don't set the input type to hidden or else the bot won't fall for it.

When you are validating the form (either client or server side) check if your dummy field has been filled to determine if it was send by a human or a bot.

उदाहरण:

In case of a human: The user will not see the dummy field (in my case named "email") and will not attempt to fill it. So the value of the dummy field should still be empty when the form has been send.

In case of a bot: The bot will see a field whose type is text and a name email (or whatever it is you called it) and will logically attempt to fill it with appropriate data. It doesn't care if you styled the input form with some fancy CSS, web-developers do it all the time. Whatever the value in the dummy field is, we don't care as long as it's larger than 0 characters.

I used this method on a guestbook in combination with CAPTCHA , and I haven't seen a single spam post since. I had used a CAPTCHA-only solution before, but eventually it resulted in about five spam posts every hour. Adding the dummy field in the form has stopped (at least till now) all the spam from appearing.

I believe this can also be used just fine with a login/authentication form.

Warning : Of course this method is not 100% fool proof. Bots can be programmed to ignore input fields with the style display:none applied to it. You also have to think about people who use some form of auto-completion (like most browsers have built-in!) to auto-fill all form fields for them. They might just as well pick up a dummy field.

You can also vary this up a little by leaving the dummy field visible but outside the boundaries of screen, but this is totally up to you.

Be creative!

I do not think the above answer is "wrong" but there are large areas of authentication that are not touched upon (or rather the emphasis is on "how to implement cookie sessions", not on "what options are available and what are the trade offs".

My suggested edits / answers are

  • The problem lies more in account setup than in password checking.
  • The use of two factor authenitication is much more secure than more clever means of password encryption
  • Do NOT try to implement your own login form or database storage of passwords, unless the data being stored is valueless at account creation and self-generated (that is, web 2.0 style like Facebook, Flickr , etc.)

    1. Digest Authentication is a standards based approach supported in all major browsers and servers, that will not send a password even over a secure channel.

This avoids any need to have "sessions" or cookies as the browser itself will re-encrypt the communication each time. It is the most "lightweight" development approach.

However, I do not recommend this, except for public, low value services. This is an issue with some of the other answers above – do not try an re-implement server-side authetication mechanisms – this problem has been solved and is supported by most major browsers. Do not use cookies. Do not store anything in your own hand-rolled database. Just ask, per request, if the request is autheticated. Everything else should be supported by configuration and third-party trusted software.

So …

First, we are confusing the initial creation of an account (with a password) with the re-checking of the password subsequently. If I am Flickr and creating your site for the first time, the new user has access to zero value (blank web space). I truly do not care if the person creating the account is lying about their name. If I am creating an account of the hospital intranet / extranet, the value lies in all the medical records, and so I do care about the identity (*) of the account creator.

This is the very very hard part. The only decent solution is a web of trust. For example, you join the hospital as a doctor. You create a web page hosted somewhere with your photo, your passport number and a public key, and hash them all with the private key. You then visit the hospital and the system administrator looks at your passport, sees if the photo matches you, and then hashes the web page / photo hash with the hospital private key. From now on we can securely exchange keys and tokens. As can anyone who trusts the hospital (there is the secret sauce BTW). The system administrator can also give you an RSA dongle or other two-factor authentication.

But this is a lot of hassle, and not very web 2.0. However, it is the only secure way to create new accounts that have access to valuable information that is not self-created.

  1. Kerberos and SPNEGO – single sign on mechanisms with a trusted third party – basically the user verifies against a trusted third party. (NB this is not in any way the not to be trusted OAuth )

  2. SRP – sort of clever password authentication without a trusted third party. But here we are getting into the realms of "it's safer to use two factor authentication, even if that's costlier"

  3. SSL client side – give the clients a public key certificate (support in all major browsers – but raises questions over client machine security).

In the end it's a tradeoff – what is the cost of a security breach vs the cost of implementing more secure approaches. One day, we may see a proper PKI widely accepted and so no more own rolled authentication forms and databases. One day…

When hashing, don't use fast hash algorithms such as MD5 (many hardware implementations exist). Use something like SHA-512. For passwords, slower hashes are better.

The faster you can create hashes, the faster any brute force checker can work. Slower hashes will therefore slow down brute forcing. A slow hash algorithm will make brute forcing impractical for longer passwords (8 digits +)

A good article about realistic password strength estimation is:

Dropbox Tech Blog » Blog Archive » zxcvbn: realistic password strength estimation

My favourite rule in regards to authentication systems: use passphrases, not passwords. Easy to remember, hard to crack. More info: Coding Horror: Passwords vs. Pass Phrases

I'd like to add one suggestion I've used, based on defense in depth. You don't need to have the same auth&auth system for admins as regular users. You can have a separate login form on a separate url executing separate code for requests that will grant high privileges. This one can make choices that would be a total pain to regular users. One such that I've used is to actually scramble the login URL for admin access and email the admin the new URL. Stops any brute force attack right away as your new URL can be arbitrarily difficult (very long random string) but your admin user's only inconvenience is following a link in their email. The attacker no longer knows where to even POST to.

I dont't know whether it was best to answer this as an answer or as a comment. I opted for the first option.

Regarding the poing PART IV: Forgotten Password Functionality in the first answer, I would make a point about Timing Attacks.

In the Remember your password forms, an attacker could potentially check a full list of emails and detect which are registered to the system (see link below).

Regarding the Forgotten Password Form, I would add that it is a good idea to equal times between successful and unsucessful queries with some delay function.

https://crypto.stanford.edu/~dabo/papers/webtiming.pdf

I would like to add one very-important comment:

  • "In a corporate, intra- net setting," most if not all of the foregoing might not apply!

Many corporations deploy "internal use only" websites which are, effectively, "corporate applications" that happen to have been implemented through URLs. These URLs can (supposedly …) only be resolved within "the company's internal network." (Which network magically includes all VPN-connected 'road warriors.')

When a user is dutifully-connected to the aforesaid network, their identity ("authentication") is [already …] "conclusively known," as is their permission ("authorization") to do certain things … such as … "to access this website."

This "authentication + authorization" service can be provided by several different technologies, such as LDAP (Microsoft OpenDirectory) , or Kerberos.

From your point-of-view, you simply know this: that anyone who legitimately winds-up at your website must be accompanied by [an environment-variable magically containing …] a "token." ( ie The absence of such a token must be immediate grounds for 404 Not Found .)

The token's value makes no sense to you, but, should the need arise, "appropriate means exist" by which your web-site can "[authoritatively] ask someone who knows (LDAP… etc.)" about any and every(!) question that you may have. In other words, you do not avail yourself of any "home-grown logic." Instead, you inquire of The Authority and implicitly trust its verdict.

Uh huh … it's quite a mental-switch from the "wild-and-wooly Internet."

Use OpenID Connect or User-Managed Access .

As nothing is more efficient than not doing it at all.