Tarayıcı, kullanıcıdan parolayı kaydetmesini ne zaman isteyeceğini nasıl bilir?


82

Bu, burada sorduğum soruyla ilgili: Tarayıcıdan şifreyi kaydetmesini nasıl isteyebilirim?

Sorun şu: Tarayıcımı geliştirdiğim sitenin parolasını kaydetmemi istemesini sağlayamıyorum. (Firefox'ta bazen bir form gönderdiğinizde görünen ve "siteniz.com için parolayı hatırlıyor musunuz? Evet / Şimdi değil / Asla" yazan çubuktan bahsediyorum)

Bu çok sinir bozucu çünkü Firefox'un bu özelliği (ve benzer şekilde çalışacağını umduğum diğer modern tarayıcıların çoğu) bir muamma gibi görünüyor. Tarayıcının yaptığı, kodunuza nerede baktığı veya gönderdiğiniz şeye veya başka bir şeye baktığı sihirli bir numara gibi ve kullanıcı adı (veya e-posta adresi) alanı ve şifre alanı olan bir giriş formu gibi "görünüyorsa", kaydetmek.

Bu durum dışında, oturum açma formumu kullandıktan sonra kullanıcılarıma bu seçeneği sunmadığı ve beni deli ettiği durumlar hariç. :-)

(Firefox ayarlarımı kontrol ettim - bu site için tarayıcıya "asla" demedim. Yönlendirici olmalı.)

Benim sorum

Firefox'un kullanıcıdan ne zaman kaydetmesi gerektiğini öğrenmek için kullandığı buluşsal yöntemler nelerdir? Bu, Mozilla kaynağında olduğu için yanıtlaması çok zor olmamalı (Nereye bakacağımı bilmiyorum yoksa kendim çıkarmaya çalışırım). Bununla ilgili olarak Mozilla geliştiricilerinden bir blog yazısı veya benzer geliştirici notları bulma şansım da olmadı.

(Bu sorunun Safari veya IE için yanıtlanmasından memnun olurum; tüm tarayıcıların çok benzer kurallar kullandığını düşünürdüm, bu yüzden bunlardan birinde çalıştırabilirsem, diğerlerinde çalışacaktır.)

(* Bana verdiğiniz cevabın çerezler, şifreleme veya şifreleri yerel veritabanımda nasıl sakladığımla ilgili başka herhangi bir şeyle ilgisi varsa, sorumu yanlış anlamış olma ihtimalinizin yüksek olduğunu unutmayın. :-)


1
Bilmiyorum. Formunuz şifre türü alanı olan bir POST formu mu?
zneak

2
Evet, <form> etiketleri arasına alınmış ve alanlar 'kullanıcı adı' ve 'şifre' olarak adlandırılıyor. AJAX ile ayrı bir katman olarak yüklüyorum, ancak disqus.com da yapıyor (sadece oraya bir örnek vermek için) ve onlar için harika çalışıyor. Bu nedenle, bir şekilde yardımcı olup olmadığını görmek için işleri rastgele (devam ettirmek) yerine, tarayıcının tam olarak nasıl düşündüğünü öğrenmek istiyorum.
Eric

Yanıtlar:


55

Okuduklarıma dayanarak, Firefox'un parolaları form.elements[n].type == "password"(tüm form öğelerini yineleyerek) algıladığını ve ardından parola alanından hemen önceki metin alanı için form öğelerinde geriye doğru arama yaparak kullanıcı adı alanını algıladığını düşünüyorum (daha fazla bilgi burada ). Javascript'te benzer bir şey deneyebilir ve şifre alanınızı tespit edip edemeyeceğinizi görebilirsiniz.

Söyleyebileceğim kadarıyla, giriş formunuzun bir parçası olması gerekiyor, <form>yoksa Firefox onu algılamayacak. id="password"Parola alanınızı ayarlamak muhtemelen zarar vermez.

Bu hala size çok fazla sorun veriyorsa, Mozilla projesinin geliştirici posta listelerinden birine sormanızı tavsiye ederim (özelliği tasarlayan geliştiriciden bir yanıt bile alabilirsiniz).


2
Bu harika. Teşekkürler. Ben de bunu arıyorum.
Eric

1
Bu, Firefox'ta çalışmasını sağlamama yardımcı oldu, ancak Chrome konusunda hiç şansım yok. Kullandığım biçim şu: <form id = "myForm" action = "#"> <input id = "kullanıcı adı"> <input id = "şifre" type = "şifre"> </form>
1,21 gigawatt

3
@ 1.21gigawatts - Bunu yapmanın "standart" bir yolu yok (bildiğim kadarıyla), bu nedenle farklı tarayıcılar bunu biraz farklı yapabilir. Chrome'un işleminin Firefox'unkinden nasıl farklı olduğunu bilmiyorum, ancak Chrome kaynak koduna bakarsanız bunu anlayabilirsiniz. Firefox'un bunu nasıl yaptığını bilmemin tek yolu, kodlarını okumaktı. Bu, her tarayıcının bunu nasıl yaptığını listeleyen, büyük bir grafikte belgelendirilmesi gereken türden bir şey ...
bta

3
Parola yöneticisi kodunun bir yazarı, 2013 tarihli bir blog gönderisinde size yol gösterir
dat

2
Şifre yöneticisi blog gönderilerinin bağlantısı güncellendi: dolske.wordpress.com/2013/08
Vsevolod Golovanov

17

Aynı sorunu yaşadım ve bir çözüm buldum:

  1. tarayıcının şifreyi saklamasını istemesini sağlamak için, kullanıcı adı ve şifre kutuları bir formda olmalı ve bu form gerçekten gönderilmelidir. Gönder düğmesi, onclick işleyiciden yanlış döndürebilir (bu nedenle gönderme gerçekten gerçekleşmez).

  2. tarayıcının önceden kaydedilmiş parolayı geri yüklemesini sağlamak için, giriş kutularının ana HTML biçiminde olması ve dinamik olarak javascript aracılığıyla oluşturulmaması gerekir. Form, display: none ile oluşturulabilir.

Parola, sayfa yüklenir yüklenmez doldurulur ve tüm oturum boyunca orada bulunur, böylece enjekte edilen javascript tarafından okunabilir: bu tür saldırıları çok daha kötü hale getirir. Bundan kaçınmak için, sadece giriş yapmak için ayrı bir sayfaya yönlendirmek mantıklıdır ve bu konuyu okumaya başladığınız tüm sorunları çözer :). Kısmi bir çözüm olarak, formu gönderdikten sonra alanları temizliyorum - kullanıcı oturumu kapatır ve tekrar giriş yapmak isterse, şifre tarayıcı tarafından doldurulmaz, ancak bu benim için önemsizdir.

Viliam



Firefox 3.5 ve IE8'de çalışır, Chrome'da çalışmaz (nokta 1 çalışmıyor). Belki de
gönderi

user324356 - Formu "#" olarak ayarladım ve ardından myForm.submit () adını verdim ve Firefox'ta işe yarayan ancak Chrome'da sorulmayan.
1,21 gigawatt

1
fyi: Kullandığınızda return falseveya event.preventDefault()bu hata nedeniyle Chrome'da çalışmayacaktır: code.google.com/p/chromium/issues/detail?id=282488
mkurz

Bu, firefox tarafından kullanılan mevcut algoritma için kesinlikle önemlidir - şifre yöneticisinin "aradığı" tek şey bu değildir, ancak firefox şifre yöneticisi gerçek bir gönderme olmadan tetiklenmeyecektir.
dat

Güncelleme: Chrome 46 yanlış davranışını düzeltti - şimdi her şey yolunda gitmeli. Bkz stackoverflow.com/a/33113374/810109
mkurz

10

Sen bakmak gerekir Mozilla Şifre Yöneticisi hata ayıklama sayfa ve nsILoginManager docs (sadece Firefox şifre yönetimi ile ilgilenen nasıl Konunun özü teknik detaylar için) uzantısı yazarlar için. Parola yöneticisinin siteler ve uzantılarla nasıl etkileşimde bulunduğunu bilmek isteyeceğinizden daha fazlasını öğrenmek için buradaki yanıtları ve oraya bağlanan diğer sayfaları araştırabilirsiniz.

(Özellikle şifre yöneticisi hata ayıklama belgesinde belirtildiği gibi, html'nizde otomatik tamamlamayı kapalı olarak ayarlamadığınızdan emin olun, çünkü bu, kullanıcı adı ve şifreyi kaydetme istemini bastırır)


7

Bu, Mac'te Firefox, Chrome ve Safari için çalışıyor gibi görünüyor. Windows'ta test edilmemiştir.

<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>

Bunun sayfaya eklenmesi gerekiyor. Dinamik olarak eklenemez. Form ve iframe şu şekilde ayarlanabilir: yok. İframe'in src'sini ayarlamazsanız, formu en az bir kez gönderene kadar istem gösterilmez.

Ardından formu gönderin () arayın:

bridgeForm.submit();

Eylem isteğe bağlı olabilir ve otomatik tamamlama isteğe bağlı olabilir. Test edilmedi.

Not : Bazı tarayıcılarda, tarayıcının yanıt vermesi için formun bir sunucuda (localhost ve dosya sisteminde değil) çalışıyor olması gerekir.

Yani bu:

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

bu değil:

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


@ErikAronesty bir çözüm buldunuz mu? Bazı tarayıcılarda (safari) sayfanın yerel ana bilgisayarda veya dosya sisteminde değil bir sunucuda olması gerektiğini fark ettim.
1.21 gigawatt

1
Chrome 46, yanlış davranışını düzeltti - artık iframegeçici çözümlere gerek yok. Bkz stackoverflow.com/a/33113374/810109
mkurz

6

Benim için açısal, krom, firefox ile çalışıyor: (Saatlerce araştırdım ve test ettim - krom için form eylem parametresi ( #) cevaptı. @ 1.21 gigawatt , teşekkür ederim !!! Cevabınız paha biçilemezdi.)

form

firefox 30.0 - gizli bir iframe ve gönder düğmesine (aşağıda gösterildiği gibi) ihtiyaç duymaz, ancak aşağıdaki gibi otomatik doldurulan kredileri tanımak için "login-form-autofill-fix" yönergesine ihtiyaç duyar:

<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>

gizli iframe

chrome 35.0 - yukarıdaki yönergeye ihtiyaç duymaz, ancak gizli bir iframe'e ve gerçek formda bir gönder düğmesine ihtiyaç duyar. Gizli iframe şuna benzer:

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

açısal yönerge (jqLite kullanarak)

Bu açısal 1.2.18 ile çalışır

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);
});

değişiklik

  • Bazı testlerden sonra, Chrome'un açısal oturum açma yöntemiyle (200ms) biraz zaman aşımına ihtiyaç duyduğunu fark ettim - öyle görünüyor ki, yönlendirme bazen şifre yöneticisi için çok hızlı.
  • tarayıcı önbelleğini daha iyi temizleyin ... her değişiklikle

en yeni kromdan beri, pw-yöneticisi formu yalnızca bazen doldurur. ayrıca pw yöneticisi bazen açılır, bazen değil ... artık rastgele bir işlev gibi görünüyor.
110ma veya

yeni firefox otomatik olarak doldurulan şifre alanını yok sayar. triggerHandler ("input") çalışmıyor. bu, yerel bir olay (document.createEvent) ile çözülebilir - bunu bir yangın gönderin.
110ma veya

1
Chrome 46, yanlış davranışını düzeltti - artık iframegeçici çözümlere gerek yok. Bkz stackoverflow.com/a/33113374/810109
mkurz

@ 110maor Gönderinizi anlamam uzun zaman aldı. Umarım düzenlemelerim niyetinize doğrudur.
jpaugh

3

Eh, üzerine sitemizde , adıyla bir form alanına "kullanıcı adı" tip "metin" derhal ismi "şifre" ve tip "şifre" sahip bir alan tarafından takip hileye neden olabilir.


Benim için çok hızlı! Düşüncelerim tam olarak ... (Cevabımı
siliyorum

Evet. Denedim. Şanssız. :-( Teorim, sayfada tarayıcının beğenmediği / sayfanın bir giriş formu olmadığını düşündüren başka bir şey daha var ...
Eric


3

Buluşsal yöntemler burada oldukça basittir: belirli adlara sahip alanları belirli sırayla tespit edin. Hangilerini söyleyemem ama bu, Chrome ve IE'de benim için iyi çalıştı:

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.

Ben değiştirmek zorunda <button type="submit">tarafından <input type="submit">işe Dashlane olsun. Bunun bir şey olduğuna bile inanamıyorum ...
Bram Verstraten

3

Ayrıca oturum açma isteğinden sonra giriş formu hala mevcutsa, sayfada gizli olsa bile Chrome'un bir şifreyi hatırlamayı teklif etmeyeceğini fark ettim.

Sanırım oturum açma işleminin başarısız olduğunu ve bu nedenle geçersiz kimlik bilgilerini saklamayı reddettiğini düşünüyor.

Chrome 34.0'da görüldü.


1
Chrome 46 yanlış davranışını düzeltti, bir ajax isteğinden sonra formu gizlemek yeterli olmalı. Bkz stackoverflow.com/a/33113374/810109
mkurz


0

Daha önce söylenenlere ek olarak, giriş alanlarının "devre dışı bırakılmaması" gerektiğini fark ettim. Önce kullanıcı adını ve ardından sonraki ekranda şifreyi isteyen çok adımlı bir giriş yaptık. İkinci ekranda e-postayı tekrarladık ama devre dışı bıraktık ve bu da Chrome et'i engelledi. al. kullanıcı adı için geçerli bir alan olarak tanınmasını engeller.

Bu devre dışı bırakılan giriş alanını gerçekten korumak istediğimizden, bu karmaşık geçici çözümü bulduk:

<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">

Bunu tavsiye etmek için çok ileri gitmezdim ama belki birisini kendi kodunda bir şeye yönlendiriyor:

  1. İlk öğe, kullanıcı adını devre dışı bırakılmış bir giriş alanında görüntüler. Devre dışı bırakıldı, formun bir parçası olarak gönderilmez ve devre dışı bırakılmış, tarayıcı tarafından tanınmaz.
  2. İkinci öğe, type = "text" ve name / id = "username" ile uygun bir giriş alanıdır. Bu, tarayıcı tarafından tanınıyor. Kullanıcının düzenlemesini engellemek için CSS ile gizleriz (display: none).

Değeri gönderilen ancak kullanıcının değiştiremeyeceği bir girdi istediğiniz durumlarda, "devre dışı" yerine "salt okunur" seçeneğini deneyebilirsiniz.
David Brown

0

Örneğin, formunuzda input type = password'den önce iki tür = metin varsa, Tarayıcı, kullanıcı adınız için en yakın input type = metni algılar.

Bu, başka bir girişin sahip olduğu önemli değildir = kullanıcı adı ve ad = kullanıcı adı

Bu sorunu çözmek için, kaydetmek istediğiniz kullanıcı adı girişinizi giriş şifrenizin tam önüne koymalısınız.

İyi şanslar :-)


-2

Ana anahtar kelime burada,

   <input type="password">

1
Başkalarına yardımcı olacağından cevabınızı biraz daha ayrıntıyla açıklamaya çalışın.
Ashish Duklan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.