उपयोगकर्ता को पासवर्ड बचाने के लिए संकेत देने के लिए ब्राउज़र को कैसे पता चलता है?


82

यह मेरे द्वारा पूछे गए प्रश्न से संबंधित है: मैं पासवर्ड बचाने के लिए संकेत देने के लिए ब्राउज़र कैसे प्राप्त कर सकता हूं?

यह समस्या है: मैं उस साइट के लिए पासवर्ड सहेजने के लिए मुझे संकेत देने के लिए अपना ब्राउज़र प्राप्त नहीं कर सकता जो मैं विकसित कर रहा हूं। (मैं उस बार के बारे में बात कर रहा हूं जो कभी-कभी फ़ायरफ़ॉक्स पर एक फॉर्म सबमिट करते समय दिखाई देता है, जो कहता है कि "याद रखें योराइट के लिए पासवर्ड। हां! अभी नहीं / कभी नहीं")

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

इस मामले को छोड़कर, जहां यह मेरे उपयोगकर्ताओं को मेरे लॉगिन फ़ॉर्म का उपयोग करने के बाद उस विकल्प की पेशकश नहीं कर रहा है, और यह मुझे पागल बना रहा है। :-)

(मैंने अपनी फ़ायरफ़ॉक्स सेटिंग्स की जाँच की- मैंने इस साइट के लिए ब्राउज़र को "कभी नहीं" नहीं बताया है। यह संकेत देना चाहिए।)

मेरा प्रश्न

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

(मैं सफारी या IE के लिए उत्तर दिए जा रहे इस प्रश्न के साथ ठीक रहूंगा; मैं कल्पना करूंगा कि सभी ब्राउज़र उपयोगकर्ता बहुत समान नियम हैं, इसलिए यदि मैं इसे उनमें से किसी एक में काम कर सकता हूं, तो यह दूसरों में काम करेगा।)

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


1
मुझे नही पता। क्या आपका फ़ॉर्म पासवर्ड-फ़ील्ड के साथ एक POST फ़ॉर्म है?
zneak

2
हां, जिसे <form> टैग्स में लपेटा गया है, और फ़ील्ड का नाम 'उपयोगकर्ता नाम' और 'पासवर्ड' है। मैं इसे AJAX के साथ एक अलग परत के रूप में लोड करता हूं, लेकिन इसलिए disqus.com (केवल एक उदाहरण को बाहर फेंकने के लिए) करता है और यह उनके लिए बहुत अच्छा काम करता है। इसलिए, इसके बजाय (जारी) बेतरतीब ढंग से चीजों को देखना जारी रखें कि क्या यह किसी तरह से मदद करता है, मैं यह पता लगाना चाहता हूं कि ब्राउज़र कैसे सोच रहा है।
एरिक

जवाबों:


55

मैंने जो पढ़ा है, उसके आधार पर, मुझे लगता है कि फ़ायरफ़ॉक्स पासवर्ड का पता लगाता है form.elements[n].type == "password"(सभी फॉर्म तत्वों के माध्यम से पुनरावृत्ति करता है) और फिर पासवर्ड फ़ील्ड से पहले टेक्स्ट फ़ील्ड के लिए फॉर्म तत्वों के माध्यम से पीछे की ओर खोज करके उपयोगकर्ता नाम फ़ील्ड का पता लगाता है (अधिक जानकारी यहाँ )। आप जावास्क्रिप्ट में कुछ इसी तरह की कोशिश कर सकते हैं और देखें कि क्या आप अपने पासवर्ड क्षेत्र का पता लगा सकते हैं।

मैं जो बता सकता हूं, उससे आपके लॉगिन फॉर्म का हिस्सा होना चाहिए <form>या फ़ायरफ़ॉक्स इसका पता नहीं लगाएगा। id="password"अपने पासवर्ड फ़ील्ड पर सेट करना संभवतः चोट नहीं पहुँचा सकता है।

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


2
यह अद्भुत है। धन्यवाद। यही मैं ढूंढ रहा हूं।
एरिक

1
इससे मुझे फ़ायरफ़ॉक्स में काम करने में मदद मिली, लेकिन मुझे क्रोम से कोई वास्ता नहीं है। यह वह रूप है जिसका मैं उपयोग कर रहा हूं: <फॉर्म आईडी = "myForm" क्रिया = "#"> <इनपुट आईडी = "उपयोगकर्ता नाम"> <इनपुट आईडी = "पासवर्ड" प्रकार = "पासवर्ड"> </ फार्म>
1.21 गीगावाट

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

3
पासवर्ड प्रबंधक कोड के एक लेखक ने 2013 के ब्लॉग पोस्ट में आपको चीजों के माध्यम से चलता है - यह एक सार्थक पढ़ा है: blog.mozilla.org/dolske/2013/08/20/on-firefoxs-password-manager
dat

2
पासवर्ड प्रबंधक ब्लॉग पोस्ट के अपडेट लिंक: dolske.wordpress.com/2013/08
Vsevolod Golovanov

17

मुझे एक ही समस्या थी और एक समाधान मिला:

  1. ब्राउज़र को पासवर्ड स्टोर करने के लिए कहें, यूजर नेम और पासवर्ड बॉक्स एक फॉर्म में होने चाहिए और वह फॉर्म वास्तव में सबमिट होना चाहिए। सबमिट बटन ऑनक्लिक हैंडलर से गलत हो सकता है (इसलिए सबमिट वास्तव में नहीं होता है)।

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

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

Viliam



फ़ायरफ़ॉक्स 3.5 और IE8 में काम करता है, क्रोम में काम नहीं करता है (बिंदु 1 काम नहीं करता है)। हो सकता है कि जमा को वास्तविक होना चाहिए ...
user324356

user324356 - मैंने फॉर्म को "#" पर सेट किया, फिर myForm.submit () कहा और फ़ायरफ़ॉक्स में काम किया लेकिन क्रोम प्रॉम्प्ट नहीं है।
1.21 गीगावाट

1
फी: जब आप इस बग की वजह से क्रोम में काम करेंगे return falseया event.preventDefault()नहीं करेंगे: code.google.com/p/chromium/issues/detail?id=282488
mkurz

यह निश्चित रूप से फ़ायरफ़ॉक्स द्वारा उपयोग किए जाने वाले वर्तमान एल्गोरिथ्म के साथ महत्वपूर्ण है - यह पासवर्ड मैनेजर "के लिए दिखता है" केवल एक चीज नहीं है, लेकिन फ़ायरफ़ॉक्स पासवर्ड प्रबंधक को वास्तविक जमा w / o ट्रिगर नहीं किया जाएगा।
डाट

अपडेट: क्रोम 46 ने अपना गलत व्यवहार तय किया - अब सब कुछ ठीक होना चाहिए। देखें stackoverflow.com/a/33113374/810109
mkurz

10

आपको एक्सटेंशन लेखकों के लिए मोज़िला पासवर्ड मैनेजर डीबगिंग पृष्ठ और nsILoginManager डॉक्स को देखना चाहिए (फ़ायरफ़ॉक्स पासवर्ड प्रबंधन के साथ कैसे काम करता है, इसके बारे में सिर्फ चुटीली तकनीकी जानकारी दी गई है)। आप वहां दिए गए जवाबों और वहां से जुड़े अन्य पन्नों को खोद सकते हैं ताकि आपको पता चल सके कि शायद आप यह जानना चाहते हैं कि पासवर्ड मैनेजर साइट्स और एक्सटेंशन के साथ कैसे इंटरैक्ट करता है।

(विशेष रूप से पासवर्ड मैनेजर डिबगिंग डॉक में बताया गया है, सुनिश्चित करें कि आपके पास अपने HTML में बंद करने के लिए स्वत: पूर्ण सेट नहीं है, क्योंकि यह उपयोगकर्ता नाम और पासवर्ड को बचाने के लिए संकेत को दबा देगा)


7

यह मैक पर फ़ायरफ़ॉक्स, क्रोम और सफारी के लिए काम करता है। विंडोज पर परीक्षण नहीं किया गया।

<form id="bridgeForm" action="#" target="loginframe" autocomplete="on">
    <input type="text" name="username" id="username" />
    <input type="password" name="password" id="password"/>
</form>

<iframe id="loginframe" name="loginframe" src="anyblankpage.html"></iframe>

इसे पेज में जोड़ना होगा। इसे गतिशील रूप से नहीं जोड़ा जा सकता है। फ़ॉर्म और iframe को प्रदर्शित करने के लिए सेट किया जा सकता है: कोई नहीं। यदि आप iframe का src सेट नहीं करते हैं, तो प्रॉम्प्ट तब तक नहीं दिखाएगा जब तक कि आपने कम से कम एक बार फ़ॉर्म सबमिट नहीं किया हो।

फिर फॉर्म सबमिट सबमिट करें ():

bridgeForm.submit();

कार्रवाई वैकल्पिक हो सकती है और स्वतः पूर्ण वैकल्पिक हो सकती है। परीक्षण नहीं किया गया।

नोट : कुछ ब्राउज़रों पर, ब्राउज़र का जवाब देने से पहले फॉर्म को सर्वर (लोकलहोस्ट नहीं और फाइल सिस्टम नहीं) पर चलना होगा।

तो यह:

http://www.mysite.com/myPage.html

यह नहीं:

http://126.0.0.1/myPage.html
http://localhost/myPage.html
file://directory/myPage.html


@ ErikAronesty क्या आप कोई समाधान लेकर आई हैं? मैंने देखा कि कुछ ब्राउज़रों (सफारी) में पेज एक सर्वर पर होना चाहिए, न कि स्थानीय होस्ट या फाइल सिस्टम।
1.21 गीगावाट

1
Chrome 46 ने अपने गलत व्यवहार को ठीक कर लिया - iframeअब किसी भी तरह के वर्कअराउंड की आवश्यकता नहीं है। देखें stackoverflow.com/a/33113374/810109
mkurz

6

मेरे लिए कोणीय, क्रोम, फ़ायरफ़ॉक्स के साथ काम करता है: (मैंने घंटों खोजा और परीक्षण किया है - क्रोम के लिए फॉर्म एक्शन पैरामीटर ( #) जवाब था। @ 1.21 गीगावाट , धन्यवाद! आपका जवाब अमूल्य था।)

प्रपत्र

फ़ायरफ़ॉक्स 30.0 - एक छिपे हुए iframe और सबमिट बटन की आवश्यकता नहीं है (जैसा कि नीचे दिखाया गया है), लेकिन ऑटोफ़िल क्रेडेंशियल्स को पहचानने के लिए "लॉगिन-फ़ॉर्म-ऑटोफ़िल-फिक्स" निर्देश की आवश्यकता है, निम्नानुसार है:

<form name="loginForm" login-form-autofill-fix action="#" target="emptyPageForLogin" method="post" ng-submit="login({loginName:grpEmail,password:grpPassword})">
<input type="text" name=username" id="username" ng-model="grpEmail"/>
<input type="password" name="password" id="password" ng-model="grpPassword"/>
<button type="submit">Login</button>
</form>

छिपा हुआ आइफ्रेम

क्रोम 35.0 - उपरोक्त निर्देश की आवश्यकता नहीं है, लेकिन वास्तविक फॉर्म पर एक छिपे हुए iframe और सबमिट बटन की आवश्यकता है। छिपा हुआ इफ्रेम जैसा दिखता है

<iframe src="emptyPageForLogin.html" id="emptyPageForLogin" name="emptyPageForLogin" style="display:none"></iframe>

कोणीय निर्देशन (jqLite का उपयोग करके)

यह कोणीय 1.2.18 के साथ काम करता है

module.directive('loginFormAutofillFix', function() { 
            return function(scope, elem, attrs) {
        if(!attrs.ngSubmit) {
            return;
        }
        setTimeout(function() {
            elem.unbind("submit").bind("submit", function(e) {
                //DO NOT PREVENT!  e.preventDefault(); 
                elem.find("input").triggerHandler("input");
                scope.$apply(attrs.ngSubmit);
            });
        }, 0);
});

संशोधन

  • कुछ परीक्षण के बाद, मुझे एहसास हुआ कि क्रोम को कोणीय लॉगिन विधि (200ms) द्वारा थोड़ा समय की आवश्यकता है - ऐसा लगता है, रीडायरेक्ट कभी-कभी पासवर्ड मैनेजर के लिए बहुत तेज़ होता है।
  • हर परिवर्तन के साथ बेहतर स्पष्ट ब्राउज़र ...

चूंकि आधुनिक क्रोम pw-manager केवल कभी-कभी फॉर्म में भरता है। यह भी pw प्रबंधक कभी कभी चबूतरे, कभी कभी नहीं ... अब एक यादृच्छिक समारोह लगता है।
110maor

नया फ़ायरफ़ॉक्स ऑटो-भरे पासवर्ड फ़ील्ड को अनदेखा करता है। ट्रिगरहैंडलर ("इनपुट") काम नहीं कर रहा है। इसे एक मूल घटना (document.createEvent) के साथ हल किया जा सकता है - इसे आग लगा दें।
110maor

1
Chrome 46 ने अपने गलत व्यवहार को ठीक कर लिया - iframeअब किसी भी तरह के वर्कअराउंड की आवश्यकता नहीं है। देखें stackoverflow.com/a/33113374/810109
mkurz 22

@ 110maor आपकी पोस्ट को समझने में मुझे लंबा समय लगा। मुझे उम्मीद है कि मेरे संपादन आपके इरादे पर खरे हैं।
19

3

खैर, हमारी साइट पर , "उपयोगकर्ता नाम" प्रकार "पाठ" के साथ एक फार्म फ़ील्ड जिसके बाद तुरंत नाम "पासवर्ड" के साथ एक फ़ील्ड होता है और "पासवर्ड" टाइप करने के लिए लगता है।


मेरे लिए बहुत जल्दी! मेरे विचार बिल्कुल ... (मैं अपना उत्तर हटा रहा हूँ)
गणेश शंकर

हाँ। इसे आजमाया। कोई भाग्य नहीं। :-( मेरा सिद्धांत है कि मेरे पास पृष्ठ पर कुछ और है जो ब्राउज़र को पसंद नहीं है / यह सोचता है कि पृष्ठ में कोई लॉगिन फ़ॉर्म नहीं है ...
Eric

3

यदि आप AJAX लॉगिन का उपयोग कर रहे हैं, तो उस स्रोत कोड पर एक नज़र डालें: https://gist.github.com/968927

इसमें एक छिपे हुए iframe में एक लॉगिन फ़ॉर्म जमा करना शामिल है, ताकि IE और Chrome पृष्ठ को फिर से लोड किए बिना वास्तविक लॉगिन का पता लगा सकें।


Chrome 46 ने अपने गलत व्यवहार को ठीक कर लिया - iframeअब किसी भी तरह के वर्कअराउंड की आवश्यकता नहीं है। देखें stackoverflow.com/a/33113374/810109
mkurz

3

यहाँ आंकड़े बहुत सरल हैं: कुछ निश्चित क्रम में कुछ नामों के साथ फ़ील्ड का पता लगाएं। कौन से, मैं नहीं बता सकता, लेकिन इसने मेरे लिए क्रोम और IE में ठीक काम किया:

Username field: name "login", type "text";
Password field: name "password", type "password"
Submit button: element "input", type "submit". 
Element "button" type "submit" did not work.

मैं बदलने के लिए था <button type="submit">द्वारा <input type="submit">काम करने के लिए Dashlane मिलता है। विश्वास नहीं किया जा सकता है, हालांकि यह भी एक बात है ...
ब्रैम वेरस्ट्रेटन

3

मैंने यह भी देखा कि क्रोम एक पासवर्ड याद रखने की पेशकश नहीं करेगा यदि लॉगिन फॉर्म लॉगिन अनुरोध के बाद भी मौजूद है, भले ही वह पृष्ठ पर छिपा हो।

मुझे लगता है कि यह सोचता है कि लॉगिन क्रिया विफल रही और इस तरह अमान्य क्रेडेंशियल्स को स्टोर करने से इनकार कर दिया गया।

Chrome 34.0 पर देखा गया।


1
Chrome 46 ने अपने गलत व्यवहार को ठीक कर दिया, अजाक्स के अनुरोध के बाद फॉर्म को छिपाना पर्याप्त होना चाहिए। देखें stackoverflow.com/a/33113374/810109
mkurz

3

मैं फ़ायरफ़ॉक्स सोर्स कोड देखने की सलाह दूंगा । यह वास्तव में बहुत सीधा कोड है।

आप जिन तरीकों को देखना चाहते हैं _onFormSubmit, वे हैं , _getFormFieldsऔर _getPasswordFields

तुम भी समस्या हो सकती है आप फ़ायरफ़ॉक्स में एक अनदेखा बग को संक्रमित है;) https://bugzilla.mozilla.org/show_bug.cgi?id=1211780


0

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

चूँकि हम वास्तव में उस अक्षम इनपुट फ़ील्ड को रखना चाहते थे, जिसे हमने इस हैक किए गए वर्कअराउंड के साथ समाप्त किया:

<input type="text" name="display-username" id="display-username" value="ENTERED_USERNAME" placeholder="Username" disabled="disabled">
<input type="text" name="username" id="username" value="ENTERED_USERNAME" placeholder="Username" style="display: none;">
<input type="password" name="password" id="password" value="" autofocus="autofocus" autocomplete="on" placeholder="Password" required="required">

मैं इसकी सिफारिश करने के लिए इतनी दूर नहीं जाऊंगा, लेकिन शायद यह किसी को अपने कोड में कुछ इंगित करता है:

  1. पहला तत्व अक्षम इनपुट फ़ील्ड में उपयोगकर्ता नाम प्रदर्शित करता है। अक्षम फ़ॉर्म के भाग के रूप में सबमिट नहीं करता है और अक्षम ब्राउज़र द्वारा मान्यता प्राप्त नहीं है।
  2. दूसरा तत्व एक उचित इनपुट फ़ील्ड है, जिसमें टाइप = "टेक्स्ट" और नाम / आईडी = "उपयोगकर्ता नाम" है। यह ब्राउज़र द्वारा पहचाना जा रहा है। उपयोगकर्ता को इसे संपादित करने से रोकने के लिए हम इसे CSS (प्रदर्शन: कोई नहीं) के साथ छिपाते हैं।

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

0

यदि आपके पास इनपुट प्रकार = पासवर्ड से पहले आपके फ़ॉर्म में दो प्रकार = पाठ हैं, तो ब्राउज़र आपके उपयोगकर्ता नाम के लिए निकटतम इनपुट प्रकार = पाठ का पता लगाता है।

यह कोई दूसरी बात नहीं है कि एक और इनपुट = उपयोगकर्ता नाम और नाम = उपयोगकर्ता नाम है

इस समस्या को हल करने के लिए आपको अपना उपयोगकर्ता नाम इनपुट डालना होगा जिसे आप अपने इनपुट पासवर्ड से ठीक पहले बचाना चाहते हैं

शुभ लाभ :-)


-2

प्रमुख कीवर्ड यहां है,

   <input type="password">

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