Tarayıcı 'Parolayı Kaydet' işlevini devre dışı bırak


423

Bir devlet sağlık kuruluşu için çalışmanın sevinçlerinden biri, PHI (Korumalı Sağlık Bilgileri) ile uğraşmak için tüm paranoya ile uğraşmak zorunda kalmaktadır. Beni yanlış anlamayın, hepimiz insanların kişisel bilgilerini (sağlık, finans, sörf alışkanlıkları, vb.) Korumak için mümkün olan her şeyi yapıyorum, ama bazen insanlar biraz fazla gergin oluyor.

Durumda: Devlet müşterilerimizden biri, son zamanlarda tarayıcının şifrenizi kaydetmek için kullanışlı bir özellik sağladığını öğrendi. Hepimiz bir süredir orada olduğunu ve tamamen isteğe bağlı olduğunu ve kullanmanın akıllıca bir karar olup olmadığına karar vermek son kullanıcıya bağlı olduğunu biliyoruz. Ancak, şu anda bir miktar kargaşa var ve sitemiz için bu işlevselliği devre dışı bırakmanın bir yolunu bulmamız isteniyor.

Soru : Bir sitenin tarayıcıya şifreleri hatırlamayı önermemesini söylemesinin bir yolu var mı? Uzun zamandır web geliştirme işindeydim ama daha önce karşılaştığımı bilmiyorum.

Herhangi bir yardım takdir.


6
İnsanların yeniden etkinleştirebilmesi için bir greasemonkey betiği sağlamalısınız. Kullanıcıların her seferinde şifreyi
yazmaya

14
Soru, yararlı ve açık olduğu için bir oylamayı hak ediyor. Öte yandan insanların bu "soruna" bir çözüm bulmasını istemiyorum.
Ian Boyd

11
Bu her zaman bir "sorun" değildir. Buraya geldim çünkü firefox, bir giriş kullanıcı adı / şifre formu değil, WiFi / SSID şifresi içeren bir form için bir şifre kaydetmek istedi. Çok can sıkıcı ve durdurmak istiyorum.
srd

1
Bilgiler bu kadar kritikse, sadece bir şifre ile korunmalıdır.
Sam Watkins

İşe yaradığı gibi görünmesinin bir yolu da <form> kullanmamaktır. Verileri (XHR) göndermek için javascript kullanıyorsanız, buna ihtiyacınız yoktur. "Bir kerelik parola" kimlik doğrulamasını kullanan bir sistemde devre dışı bırakmak istedim (saklamak için bir neden yok). Kullanıcı / geçiş kimlik doğrulamaları için bu özelliği devre dışı bırakmanızı önermem.
lepe

Yanıtlar:


322

Tüm tarayıcılarda çalışıp çalışmayacağından emin değilim ancak formda autocomplete = "off" ayarını denemelisiniz.

<form id="loginForm" action="login.cgi" method="post" autocomplete="off">

Form ve Parola depolama istemlerini devre dışı bırakmanın ve form verilerinin oturum geçmişinde önbelleğe alınmasını önlemenin en kolay ve basit yolu, "tamam" değerine sahip otomatik tamamlama form öğesi niteliğini kullanmaktır.

Gönderen http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion

Bazı küçük araştırmalar bunun IE'de çalıştığını gösteriyor, ancak hiçbir garanti bırakmayacağım;)

@Joseph : Gerçek biçimlendirme ile XHTML doğrulamasını geçmek için kesin bir gereklilikse (neden olacağını bilmiyorum) teorik olarak daha sonra javascript ile bu özelliği ekleyebilirsiniz ancak js devre dışı bırakılmış kullanıcılar (muhtemelen kullanıcı tabanınızın ihmal edilebilir bir miktarı) veya siteniz js gerektiriyorsa sıfır), şifreleri kaydedilmeye devam eder.

JQuery ile örnek:

$('#loginForm').attr('autocomplete', 'off');

48
Sadece hızlı bir yorum, çünkü bu değişiyor, HTML5 otomatik tamamlama özniteliğini spesifikasyona eklediğinden şimdi geçerli.
Tyler Egeto

11
Sadece FYI, Microsoft, Internet Explorer 11'in artık alanlar autocomplete="off"için onurlandırmayacağına karar verdi input type="password". msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx
JW Lim

6
@JWLim, IE 11'in şifre kaydetme işlevini devre dışı bırakma desteğini bıraktığı gibi Firefox da öyle. bugzilla.mozilla.org/show_bug.cgi?id=956906
Gregory Cosmo Haun

3
Firefox (maalesef) Microsoft'un liderliğini izledi ve otomatik tamamlama desteğini de "kaldırdı". Ayrıntılar için aşağıdaki sayı tartışmasında 100. yoruma bakın: bugzilla.mozilla.org/show_bug.cgi?id=956906
Zıplayan Bit


44

Ek olarak

autocomplete="off"

kullanım

readonly onfocus="this.removeAttribute('readonly');"

girişler için bunları form verilerini (hatırlamak istemediklerini username, passwordaşağıda gösterildiği gibi, vs.):

<input type="text" name="UserName" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

<input type="password" name="Password" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

Önemli tarayıcıların son sürümlerinde yani test edilmiştir Google Chrome, Mozilla Firefox, Microsoft Edgevb ve bir cazibe gibi çalışır. Bu yardımcı olur umarım.


2
@Murat Yıldız: Aynı şeyi uygulamak zorundayım ve kodunuzu takip ettim, tüm tarayıcılarda benim için iyi çalışıyor. Teşekkür ederim !
sree

1
@Sree senin için yararlı olduğu için mutluyum :)
Murat Yıldız

3
Mozilla Firefox 52.0 , Google Chrome 57.0 , Microsoft Edge 38.1'i test ettik ve bir cazibe gibi çalışıyor! ..
Murat Yıldız

1
Safari mobile'da bu yanıt düzeltildiğinden bir hata olabilir stackoverflow.com/questions/2530/…
Ferie

1
Windows Firefox 57.0.2 (64 bit) bunu uyguladıktan sonra hala şifreyi kaydetmenizi önerir.
Panu Haaramo

37

Bir süredir bu sorunla, soruna benzersiz bir bükülme ile mücadele ediyordum. Ayrıcalıklı kullanıcılar, kaydedilen şifrelerin kendileri için çalışmasını sağlayamadı, ancak normal kullanıcıların buna ihtiyacı vardı. Bu, ayrıcalıklı kullanıcıların iki kez giriş yapması gerektiği anlamına geliyordu, ikinci kez kaydedilmiş şifreleri zorlamıyordu.

Bu gereksinimle, standart autocomplete="off"yöntem tüm tarayıcılarda çalışmaz, çünkü parola ilk oturum açma işleminden kaydedilmiş olabilir. Bir meslektaş, yeni bir şifre alanıyla odaklandığında şifre alanını değiştirmek için bir çözüm buldu ve sonra yeni şifre alanına odaklanın (ardından aynı olay işleyiciyi bağlayın). Bu işe yaradı (IE6'da sonsuz bir döngüye neden olması dışında). Belki de bunun etrafında bir yol vardı, ama bu bana bir migren neden oluyordu.

Son olarak, sadece kullanıcı adı ve şifreyi formun dışında tutmaya çalıştım. Benim için sürpriz oldu, bu işe yaradı! IE6 ve Linux üzerinde Firefox ve Chrome'un mevcut sürümlerinde çalıştı. Daha fazla test etmedim, ancak tüm tarayıcılarda olmasa bile çoğunda çalıştığından şüpheleniyorum (ancak form yoksa, umursamayan bir tarayıcı olsaydı beni şaşırtmaz).

İşte bazı jQuery ile birlikte çalışmak için bazı örnek kod:

<input type="text" id="username" name="username"/>
<input type="password" id="password" name="password"/>

<form id="theForm" action="/your/login" method="post">
  <input type="hidden" id="hiddenUsername" name="username"/>
  <input type="hidden" id="hiddenPassword" name="password"/>
  <input type="submit" value="Login"/>
</form>

<script type="text/javascript" language="JavaScript">
  $("#theForm").submit(function() {
    $("#hiddenUsername").val($("#username").val());
    $("#hiddenPassword").val($("#password").val());
  });
  $("#username,#password").keypress(function(e) {
    if (e.which == 13) {
      $("#theForm").submit();
    }
  });
</script>

1
Bu iyi bir çözüm gibi görünüyor. Gönderdiğiniz formun kendisi bir şifre içermediğinden mantıklıdır. İki formun olabileceğinden emin olmak istiyorum, ilki sadece kullanıcı adı ve parolanın tüm tarayıcılarda görünür olmasını sağlamak için.
Alexis Wilke

3
Çözümünüzü beğendim ve siteme benzer bir uygulama yaptım, bugün tarayıcılar bunu çözmek için basit bir yol sunmuyor.
AgelessEssence

Ben jquery 1.6 kullanarak sıkışıp kaldım emin değilim, ancak yukarıdaki jquery sadece bir $ (belge) .ready (function () {}) içine sarma sonra çalıştı;
rgbflawed

Tek doğru ruh budur çünkü bazı tarayıcılar artık autocomplete = "off" ifadesini kabul etmeyecektir!
Abadis

1
Ben sadece krom, opera ve internet explorer bu yöntemi denedim ve işe yarıyor gibi görünüyor, ancak Firefox ile unforuntately işe yaramaz
chenks

29

Bu çok eski bir yazı, ama yine de ekibimin uzun zamandır elde etmeye çalıştığı çözümü vereceğim. Formun içine yeni bir girdi türü = "şifre" alanı ekledik ve div'a ekledik ve div'ı gizli hale getirdik. Bu div'in gerçek şifre girişinden önce olduğundan emin olun. Bu bizim için çalıştı ve herhangi bir Parola Kaydet seçeneği vermedi

Plunk - http://plnkr.co/edit/xmBR31NQMUgUhYHBiZSg?p=preview

HTML:

<form method="post" action="yoururl">
      <div class="hidden">
        <input type="password"/>
      </div>
      <input type="text" name="username" placeholder="username"/>
      <input type="password" name="password" placeholder="password"/>
    </form>

CSS:

.hidden {display:none;}

1
Gizli girişleri kullananlara karşı bu yolun bir avantajı, bu şekilde bir parolanın asla düz metin alanında saklanmamasıdır
pvgoddijn

@ whyAto8 Bu benim için Chrome 47.0.2526.111'de işe yaramadı ... işe yarama hilesi gizli div'e başka bir alan metni eklemekti. Tarayıcı parolayı kaydetmeyi istiyor ama ANCAK "Bu crendetials kaydetmek istediğinizden emin misiniz?" ve sonra boş bir kullanıcı adı ve boş bir parola gösterir. Bu işe yaradı.
David Bélanger

1
@Av8'in çözümü @David Bélanger'in yorumuyla birlikte benim için çalıştı (diğer çözümlerin hiçbiri işe yaramadı). Ayrıca, veri girişi için kullanılanlardan ÖNCE iki boş gizli alanı eklediğimi ve çoğaltılan (gizli) alanların aynı ilgili adlara sahip olduğunu belirtmeliyim. Bu şekilde Chrome (48.0.2564.103) herhangi bir şifrenin kaydedilip kaydedilmeyeceğini bile sormadı.
Vadim

Bunun hiçbir kombinasyonu Chrome 48.0.2564.116 üzerinde çalışmıyor. DavidBelanger'ın yorumuyla bile olsa, şifreyi kaydetmenizi isteyen Chrome açılır pencere, Tamam'ı tıklarsanız yine de şifreyi önbelleğe alır
ChrisO

Harika bir cevap .. Lütfen bana neden "Bu div'in gerçek şifre girişinden önce olduğundan emin oldunuz ? " Bu div'ı o gerçek şifre girişinden sonra koydum ve hala çalışıyor .. Öyleyse neden bahsettiniz?
Martin AJ

16

Her şovda şifre alanı için kullanılan adı rastgele seçerek tarayıcının formları eşleştirmesini engelleyebilirsiniz. Ardından tarayıcı, aynı URL için bir şifre görür, ancak aynı şifre olduğundan emin olamaz . Belki başka bir şeyi kontrol ediyordur.

Güncelleme: Bunun , başkaları tarafından belirtilen nedenlerden ötürü, bunların yerine otomatik tamamlama veya diğer taktikleri kullanmaya ek olarak yapılması gerektiğini unutmayın .

Ayrıca bunun yalnızca tarayıcının şifreyi otomatik olarak tamamlamasını engelleyeceğini unutmayın . Bunu engellemeyecekŞifrenin, tarayıcının kullanmayı seçtiği güvenlik düzeyinden herhangi bir düzeyde saklanmasını .


5
[@Joel] (# 32409) Bu, formun otomatik olarak doldurulmasını engelleyebilir, ancak tarayıcının bu varsayılan yeni form için şifreyi kaydetmesini istemesini önler mi?
Joseph Pecoraro

3
Bunun şimdi işe yarayacağına inanmıyorum. FF 13'te, hepsi farklı adlara sahip çeşitli şifre alanlarına sahip bir formum var. FF, söz konusu sayfa için bir şifre kaydettiğinde, kaydedilen şifreyi TÜM şifre alanlarına yapıştırır. Alanların adının ne olduğu umurumda değil (örneğin "new_password" ve "old_password" var ve kaydedilen şifre her ikisine de dökülüyor). Bu özel formda, şifreyi kaydetmek için bir kullanıcı adım yok - fark olması durumunda sadece iki şifre alanı.
Jason

1
Nods @Jason, parola alanına her seferinde bir ad için yeni bir UUID veren, tarayıcının doldurma girişimlerini yenmek için hiçbir şey yapmadı.
FP Serbestçe

14

Kullanıcının tarayıcı önbelleğinden çok daha fazla yerde saklanabilecek parolalara bağımlılığı önlemek için gerçek iki faktörlü kimlik doğrulamayı kullanın.


2
o kimlik doğrulama değil kimlik doğrulama
Jonathan.

26
@Jonathan Yazık, kimlik doğrulamasını
Ian Boyd

Başka bir çözüm, kullanıcı uygulamadan çıkış yaptıktan sonra tarayıcıyı zorla kapatan bir JavaScript uygulamak olabilir. Bu, tarayıcının tüm belleğini temizler ve böylece tarayıcının belleğinden veri alınamaz.
Ajay Takur

13

En temiz yol autocomplete="off"tag niteliğini kullanmaktır, ancak Sekme ile alanları değiştirdiğinizde Firefox buna uymuyor.

Bunu durdurabilmenin tek yolu, tarayıcıyı parolayı orada doldurmak için kandıracak sahte gizli bir şifre alanı eklemektir.

<input type="text" id="username" name="username"/>
<input type="password" id="prevent_autofill" autocomplete="off" style="display:none" tabindex="-1" />
<input type="password" id="password" autocomplete="off" name="password"/>

Çirkin bir hack'tir, çünkü kötü uygulama olarak kabul edilmesi gereken tarayıcı davranışını değiştirirsiniz. Sadece gerçekten ihtiyacınız varsa kullanın.

Not: bu, şifre otomatik doldurmayı etkili bir şekilde durduracaktır, çünkü FF, #prevent_autofill(boş olan) değerini " kaydeder" ve kaydedilen şifreleri oraya yerleştirmeye çalışır, çünkü her zaman type="password"ilgili "kullanıcı adından" sonra DOM'da bulduğu ilk girişi kullanır giriş.


Tarayıcının şifreyi doldurmasını engellemesinin ancak saklamasına izin vermenin anlamı nedir? Yalnızca kullanıcıyı, gerçekten savunmasız durumdayken parolalarının saklanmadığını düşünmesi için kandırır.
CodesInChaos

Bu şekilde, aslında şifrenizi saklamaz, çünkü FF tarafından yok sayılan diğer kutuya yazıyorsunuz. Bunun yerine boş bir dize saklar.
venimus

@CodesInChaos IMHO downvote'unuzu tekrar gözden geçirmelisiniz, çünkü endişeniz geçerli değil
venimus

12

Tüm büyük tarayıcılarda form etiketinde autocomplete = "off" eklemeyi test ettim. Aslında, ABD halklarının çoğu şimdiye kadar IE8 kullanıyor.

  1. IE8, IE9, IE10, Firefox, Safari iyi çalışıyor.

    Tarayıcı "şifreyi kaydet" istemiyor. Ayrıca, önceden kaydedilmiş kullanıcı adı ve şifre doldurulmaz.

  2. Chrome ve IE 11, autocomplete = "off" özelliğini desteklemiyor
  3. Autocomplete = "off" özelliğini destekleyen FF. ancak bazen mevcut kayıtlı kimlik bilgileri doldurulur.

11 Haziran 2014 tarihinde güncellendi

Son olarak, aşağıda javascript kullanan bir çapraz tarayıcı çözümü ve tüm tarayıcılarda iyi çalışıyor.

Giriş formundaki "form" etiketini kaldırmanız gerekiyor. İstemci tarafı doğrulamasından sonra bu kimlik bilgilerini gizli forma koyun ve gönderin.

Ayrıca, iki yöntem ekleyin. biri doğrulama için "validateLogin ()" ve diğeri dinlemek için enter olayı sırasında metin kutusuna / parolaya / düğmesine "checkAndSubmit ()" girin. çünkü şimdi giriş formunda bir form etiketi bulunmadığından, burada çalışmayan olayı girin.

HTML

<form id="HiddenLoginForm" action="" method="post">
<input type="hidden" name="username" id="hidden_username" />
<input type="hidden" name="password" id="hidden_password" />
</form>

Username: <input type="text" name="username" id="username" onKeyPress="return checkAndSubmit(event);" /> 
Password: <input type="text" name="password" id="password" onKeyPress="return checkAndSubmit(event);" /> 
<input type="button" value="submit" onClick="return validateAndLogin();" onKeyPress="return checkAndSubmit(event);" /> 

JavaScript

//For validation- you can modify as you like
function validateAndLogin(){
  var username = document.getElementById("username");
  var password = document.getElementById("password");

  if(username  && username.value == ''){
    alert("Please enter username!");
    return false;
  }

  if(password && password.value == ''){
    alert("Please enter password!");
    return false;
  }

  document.getElementById("hidden_username").value = username.value;
  document.getElementById("hidden_password").value = password.value;
  document.getElementById("HiddenLoginForm").submit();
}

//For enter event
function checkAndSubmit(e) {
 if (e.keyCode == 13) {
   validateAndLogin();
 }
}

İyi şanslar!!!


Bu yanıt faydalı bilgiler sağlamasına rağmen, tarayıcıların şifreleri kaydetmesini nasıl durduracağı sorusuna gerçekten cevap vermez .
JW Lim

@JW Lim, cevabı güncelledim. Lütfen içine bak. Teşekkürler!
Aşık

@Sivakumar, Tamam lütfen Safari'nin işletim sistemini ve sürümünü ekleyin. böylece diğer insanlar da bunun farkında. benim sistemimde çalışıyordu (Windows 8, Safary 5)
Asik

@Asik Safari 8.0.3 ve Mac OS 10.10
Sivakumar

7

Gerçekten değil - gerçekçi yapabileceğiniz tek şey sitede tavsiye sunmaktır; belki de ilk kez oturum açmadan önce, onlara tarayıcının şifreyi saklamasına izin verilmesinin önerilmediğini belirten bilgileri içeren bir form gösterebilirsiniz.

Daha sonra kullanıcı derhal tavsiyelere uyacaktır, bir not üzerine şifreyi yazacak ve monitörlerine bantlayacaktır.


10
Bunun bir hükümet sitesi olduğunu ve bu tür şeylerin siyasi olarak ücretlendirildiğini hatırlamanız gerekir . Yüksek olan biri "böyle çalışmamalı" diyorsa, gerçekçi olan denklemin bir parçası değildir. Sorun Post-It notlarına taşınmış olabilir, ancak bu konudaki politika farklı bir departmanın ele alınması için - sorun devam etti ;-) Ve aslında ciddiyim.
Jason

6

Ne yapıyorum autocomplete = "kapalı" ve bir javascript / jQuery kullanarak parola alanlarını temizleme birleşimidir.

jQuery Örneği:

$(function() { 
    $('#PasswordEdit').attr("autocomplete", "off");
    setTimeout('$("#PasswordEdit").val("");', 50); 
});

Kullanarak setTimeout()tarayıcının alanı temizlemeden önce tamamlamasını bekleyebilirsiniz, aksi takdirde alanı temizledikten sonra tarayıcı her zaman otomatik olarak tamamlanır.


3

autocomplete = "off" çalışmıyorsa ... form etiketini kaldırın ve bunun yerine bir div etiketi kullanın, ardından jquery kullanarak form değerlerini sunucuya iletin. Bu benim için çalıştı.


3

Autocomplete = "off" parola alanları için çalışmadığından, javascript'e güvenmek gerekir. Burada bulunan cevaplara dayanan basit bir çözüm.

Şifre alanınıza data-password-autocomplete = "off" özelliğini ekleyin:

<input type="password" data-password-autocomplete="off">

Aşağıdaki JS'yi ekleyin:

$(function(){
    $('[data-password-autocomplete="off"]').each(function() {
        $(this).prop('type', 'text');
        $('<input type="password"/>').hide().insertBefore(this);
        $(this).focus(function() {
            $(this).prop('type', 'password');
        });
    });     
});

Bu çözüm hem Chrome hem de FF için çalışır.


Windows Firefox 57.0.2 (64 bit) bunu uyguladıktan sonra hala şifreyi kaydetmenizi önerir.
Panu Haaramo

2

İnsanların farkına varın - 'otomatik tamamlama' özelliği çoğu zaman işe yarar, ancak ileri düzey kullanıcılar bir yer işareti kullanarak bu sorunu çözebilir.

Bir tarayıcının şifrelerinizi kaydetmesi, aslında tuş kaydetmeye karşı korumayı artırır, bu yüzden muhtemelen en güvenli seçenek şifreleri tarayıcıya kaydetmek, ancak bir ana şifre (en azından Firefox'ta) ile korumaktır.


2
"ancak ileri düzey kullanıcılar bunun üstesinden gelebilir" - web'de olsun veya olmasın çoğu uygulama özelliği için geçerlidir ve sistemi sınırlamak için bir neden olmamalıdır. İnsanlar ayrıca şifrelerini post-it'lere yazabilir ve monitörlerine koyabilirler, güvenlik için sadece uygulama açısından çok şey yapabilirsiniz ve anlamlı varsayılan davranış (yerel olarak kaydetmemek) sağlamak bir başlangıçtır.
Niels Keurentjes

2

Etrafımda yardımcı olabilecek bir işim var.

Özel bir yazı tipi kesmek yapabilirsiniz. Bu nedenle, tüm karakterleri nokta / daire / yıldız olarak içeren özel bir yazı tipi yapın. Bunu web siteniz için özel bir yazı tipi olarak kullanın. Bunu inkscape'de nasıl yapacağınızı kontrol edin: kendi yazı tipinizi nasıl oluşturabilirsiniz

Sonra oturum açma formunuzu kullanın:

<form autocomplete='off'  ...>
   <input type="text" name="email" ...>
   <input type="text" name="password" class="password" autocomplete='off' ...>
   <input type=submit>
</form>

Sonra css'nizi ekleyin:

@font-face {
    font-family: 'myCustomfont';
    src: url('myCustomfont.eot');
    src: url('myCustomfont?#iefix') format('embedded-opentype'),
         url('myCustomfont.woff') format('woff'),
         url('myCustomfont.ttf') format('truetype'),
         url('myCustomfont.svg#myCustomfont') format('svg');
    font-weight: normal;
    font-style: normal;

}
.password {
  font-family:'myCustomfont';
}

Oldukça çapraz tarayıcı uyumlu. IE6 +, FF, Safari ve Chrome'u denedim. Dönüştürdüğünüz oet yazı tipinin bozulmadığından emin olun. Umarım yardımcı olur?


1
gerçekten temiz bir çözüm burada bir şifre yazı tipi var
andrew

6
Böyle bir çözüm kullanıyorsanız, kullanıcıların bu benzer parola alanına girilen metni özgürce kopyalayabileceğini dikkate almanız gerekir. Gerçek parola alanlarında kopyalama ve kesme işlevleri devre dışı bırakılır.

2

Bu sorunu çözmenin en basit yolu, INPUT alanlarını FORM etiketinin dışına yerleştirmek ve FORM etiketinin içine iki gizli alan eklemektir. Daha sonra bir form olay dinleyicisinde, form verileri görünür girdiden görünmez olanlara sunucu kopya değerlerine gönderilmeden önce.

İşte bir örnek (form eylemi gerçek bir giriş komut dosyasına ayarlanmadığından burada çalıştıramazsınız):

<!doctype html>
<html>
<head>
  <title>Login & Save password test</title>
  <meta charset="utf-8">
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</head>

  <body>
      <!-- the following fields will show on page, but are not part of the form -->
      <input class="username" type="text" placeholder="Username" />
      <input class="password" type="password" placeholder="Password" />

      <form id="loginForm" action="login.aspx" method="post">
        <!-- thw following two fields are part of the form, but are not visible -->
        <input name="username" id="username" type="hidden" />
        <input name="password" id="password" type="hidden" />
        <!-- standard submit button -->
        <button type="submit">Login</button>
      </form>

    <script>
      // attache a event listener which will get called just before the form data is sent to server
      $('form').submit(function(ev) {
        console.log('xxx');
        // read the value from the visible INPUT and save it to invisible one
        // ... so that it gets sent to the server
        $('#username').val($('.username').val());
        $('#password').val($('.password').val());
      });
    </script>

  </body>
</html>


Windows Firefox 57.0.2 (64 bit) bunu uyguladıktan sonra hala şifreyi kaydetmenizi önerir.
Panu Haaramo

iyi, bu sadece her zaman çalışmayı durdurabilir bir kesmek oldu :)
knee-cola

bu en iyi seçenektir! göndermeden önce şifre alanını temizleyin: $ ('. password'). val ('')
ebelendez

2

Benim js (jquery) geçici çözüm, giriş formundaki parola giriş türünü değiştirmek için . Parola bir saniyeliğine görünür hale gelebilir, bu yüzden girişi hemen önce saklarım. Ben giriş formları için bu kullanmak istemem , ancak yararlı (autocomplete = "off" ile birlikte) örneğin web sitesinin yönetim bölümü içinde.

Formu göndermeden önce bunu bir konsolun içine (jquery ile) koymayı deneyin.

$('form').submit(function(event) {
    $(this).find('input[type=password]').css('visibility', 'hidden').attr('type', 'text');
});

Chrome 44.0.2403.157 (64 bit) üzerinde test edildi.


1
Bu gerçekten işe yarıyor. Bu, tarayıcının şifreyi kaydetmesini önler. Parolanın gösterilmesini önlemek için giriş alanını gizli bir div'e sarabilirsiniz. DOM yüklüyse bunu zaten yapabilirsiniz, formu gönderene kadar beklemenize gerek yoktur.
Ferry Kranenburg

IE 11.0.9600.18161 üzerinde çalışıyor!
Lu55

Bu doğru. Şimdi bunu FF 44.0.2'de denedim ve bu kesmek artık işe yaramıyor ... ne yazık. Chrome'da bu hala çalışıyor.
ovalek

[Type = Submit] veya [type = Submit] düğmesini normal bir tuş [type = button] ile değiştirebilir ve bunu tıklama işleyicisinde yapabilirsiniz. Formda [type = Submit] yoksa, formun enter tuşuyla gönderilmesini ve şifre kaydet isteminin görünmesini de engeller.
Steven Don

2

Birçok çözümü test ettim. Dinamik şifre alanı adı, çoklu şifre alanları (sahte olanlar için görünmez), giriş türünü "metin" yerine "şifre" olarak değiştirmek, autocomplete = "off", autocomplete = "new-password", ... ancak son zamanlarda hiçbir şey çözülmedi tarayıcı.

Parola hatırlamasından kurtulmak için, sonunda parolayı girdi alanı olarak ele aldım ve yazılan metni "bulanıklaştır".

Yazılan metni seçmeniz metni açık metin olarak göstereceğinden, ancak parola hatırlanmadığı için yerel bir şifre alanından daha az "güvenlidir". Ayrıca Javascript'in etkinleştirilmiş olmasına da bağlıdır.

Navigator'dan aşağıdaki teklif veya şifre hatırlama seçeneğini kullanma riskini tahmin edersiniz.

Şifre hatırlama kullanıcı tarafından yönetilebilir (site başına disbaled edilebilir), ancak "genel" veya paylaşılan bir bilgisayar için değil, kişisel bir bilgisayar için iyidir.

Benim durumum, paylaşılan bilgisayarlarda çalışan bir ERP için, bu yüzden aşağıdaki çözümümü deneyeceğim.

<input style="background-color: rgb(239, 179, 196); color: black; text-shadow: none;" name="password" size="10" maxlength="30" onfocus="this.value='';this.style.color='black'; this.style.textShadow='none';" onkeypress="this.style.color='transparent'; this.style.textShadow='1px 1px 6px green';" autocomplete="off" type="text">

1

Markus çok önemli bir noktaya değindi. autocompleteÖzelliği aramaya karar verdim ve aşağıdakileri aldım:

Bu özniteliği kullanmanın tek dezavantajı, standart olmamasıdır (IE ve Mozilla tarayıcılarında çalışır) ve XHTML doğrulamasının başarısız olmasına neden olur. Ancak bunun validasyonu kırmanın makul olduğu bir durum olduğunu düşünüyorum. ( kaynak )

Bu yüzden söylemek gerekir ki,% 100 tahta üzerinde çalışmaz, ancak büyük tarayıcılarda ele alınır, bu yüzden harika bir çözüm.


w3c standartlarına göre doğrulama bu sorun yaşıyorum. Mesele şu ki, bir Mobil bankacılık web sitesi için bu işlevselliği istiyorum. Mobil tarayıcıların yeterince katı olduğunu ve bazı geçersiz özellikler kullanılıyorsa bazen formu bozabileceğini varsayıyorum. Bu durumda ne önerirsiniz?
asgs

2
Bence bu eski bir düşünce tarzı. Birçok yeni mobil tarayıcı WebKit'ten oluşturulmuştur ve bu özelliği desteklemektedir veya yok saymaktadır. Diğer ülkelerin veya eski cep telefonlarındaki tarayıcıların bunu nasıl ele aldığının farkında değilim ama bilinmeyen öznitelikleri / öğeleri ele alma iyi bir tarayıcı için temeldir. Web geliştikçe tarayıcının kırılmaması için "geleceğin kanıtı". Geride kalabilir (yeni özellikler uygulamaz) ama kırılmaz. Umut yardımcı olur =)
Joseph Pecoraro

1
Sorunun kendisine verilen bir cevaptan ziyade, verilen cevap için bir yorum olmalıdır.
viam0Zah

1

Yukarıda denedim autocomplete="off"ama yine de başarılı bir şey. Eğer açısal js kullanıyorsanız benim önerim düğmesi ve ng-tıklama ile gitmek.

<button type="button" class="" ng-click="vm.login()" />

Bu zaten kabul edilmiş bir cevabım var, eğer birisi problemimi benim mekanizmamla gidebileceği kabul edilen cevapla çözemezse bunu ekliyor.

Soru ve cevaplar için teşekkürler.


bu açıkça bir form göndermek için enterveya returntuşuna basmayı keser .
8eecf0d2

0

Bildiğim bir yol, formu göndermeden önce parola alanından değeri kopyalamak için (örneğin) JavaScript kullanmaktır.

Bununla ilgili temel sorun, çözümün JavaScript'e bağlı olmasıdır.

Daha sonra, JavaScript'e bağlanabiliyorsa, sunucuya bir istek göndermeden önce şifreyi istemci tarafında da kullanabilirsiniz.


İstemci tarafındaki karma, sunucu tarafındaki karma işleminin yerini tutmaz. Hiç yardımcı olup olmadığı konusunda emin değilim (ayrıca yapılırsa).
Brilliand

2
İstemci tarafında karma işlemeye izin vermek tehlikelidir, çünkü bir saldırganın parolayı karma işlemeden kırması gerekmez, giriş yapmak için karma işlevini kullanabilirler. Karma parola eşdeğeri olur.
rjmunro

Brilliand'a, istemcideki karma işleminin, veritabanınızda parolayı kaydetmeden önce yalnızca sunucuda karma varsa yararlı olduğunu kabul ediyorum. Bununla birlikte, müşteri tarafında bir hash sahibi olmak, ortadaki erkeklerle belirli bir miktar soruna yardımcı olabilir. Bu, kodun bilgisayar korsanları tarafından (en azından halka açık sitelerde) mevcut olacağı için, göründüğü kadar yararlı değildir.
Alexis Wilke

0

Asıl sorun, HTML'nize özellikler eklemekten çok daha derin - bu yaygın güvenlik endişesidir, bu yüzden insanlar donanım anahtarlarını ve güvenlik için diğer çılgın şeyleri icat ettiler.

Autocomplete = "off" özelliğinin tüm tarayıcılarda mükemmel bir şekilde çalıştığını düşünün. Bu güvenliğe yardımcı olur mu? Tabii ki hayır. Kullanıcılar, şifrelerini ders kitaplarına, monitörlerine eklenmiş her ofis ziyaretçisinin görebileceği çıkartmalara yazacak, masaüstündeki metin dosyalarına kaydedecektir.

Genel olarak, web uygulaması ve web geliştiricisi hiçbir şekilde son kullanıcı güvenliğinden sorumlu değildir. Son kullanıcılar yalnızca kendilerini koruyabilir. İdeal olarak, tüm şifreleri başlarında tutmaları ve unutmaları durumunda şifre sıfırlama işlevini (veya yöneticiyle iletişim kurmaları) KULLANMALIDIR. Aksi takdirde, parolanın bir şekilde görülmesi ve çalınması riski her zaman olacaktır.

Yani ya donanım anahtarları ile çılgın bir güvenlik politikanız var (bazı bankalar temel olarak iki faktörlü kimlik doğrulamayı kullanan İnternet bankacılığı için teklif ediyor) veya temelde GÜVENLİK YOK. Tabii bu biraz abartılı. Neye karşı korumaya çalıştığınızı anlamak önemlidir:

  1. Yetkili erişim yok. En basit giriş formu temel olarak yeterlidir. Bazen rastgele güvenlik soruları, CAPTCHA'lar, şifre sertleştirme vb. Gibi ek önlemler alınır.
  2. Kimlik bilgisi koklaması. HTTPS, insanlar genel Wi-Fi etkin noktalarından vb. Web uygulamanıza erişirse bir zorunluluktur. HTTPS'ye sahip olsanız bile, kullanıcılarınızın parolalarını düzenli olarak değiştirmeleri gerektiğini unutmayın.
  3. İçeriden saldırı. Şifrelerinizi tarayıcıdan basit bir şekilde çalmaktan veya masanın üzerinde bir yere yazdığınızdan (herhangi bir BT becerisi gerektirmeyen) ve oturum dövme ve yerel ağ trafiğini (şifreli bile) durdurma ile biten iki örnek vardır. web uygulamasına başka bir son kullanıcı gibi erişme.

Bu özel yazıda, sorunun doğası nedeniyle son kullanıcı güvenliğinden dolayı asla çözemeyeceği geliştiriciye getirilen yetersiz gereksinimleri görebiliyorum. Benim asıl nokta, geliştiricinin temelde NO demesi ve dürüstçe bu tür görevlerde zaman harcamak yerine gereksinim sorununa işaret etmesi gerektiğidir. Bu, sisteminizi kesinlikle daha güvenli hale getirmez, monitörlerde çıkartmalara sahip kasalara yol açar. Ne yazık ki, bazı patronlar sadece duymak istediklerini duyarlar. Ancak, siz olsaydım asıl sorunun nereden geldiğini açıklamaya çalışırdım ve kullanıcıları otomatik olarak tüm parolalarını başlarında tutmaya zorlamadığı sürece autocomplete = "off" sorunu çözmezdi! Sonunda geliştirici kullanıcıları tamamen koruyamaz,


0

Aynı HIPAA sorunuyla karşı karşıya ve nispeten kolay bir çözüm buldu,

  1. Alan adı bir dizi olarak gizli bir şifre alanı oluşturun.

    <input type="password" name="password[]" style="display:none" />
    
  2. Gerçek şifre alanı için aynı diziyi kullanın.

    <input type="password" name="password[]" />
    

Tarayıcı (Chrome) sizden "Şifreyi kaydet" istemini isteyebilir, ancak kullanıcı kaydetmeyi seçerse, şifreyi bir sonraki girişinde gizli şifre alanını, dizideki sıfır yuvasını otomatik olarak doldurur ve 1. boşluğu boş bırakır.

"Şifre [part2]" gibi dizi tanımlamayı denedim ama hala hatırladım. Bence ilk bir noktaya bırakmaktan başka çaresi yok çünkü unindexed bir dizi ise onu atar.

Ardından, örneğin PHP gibi diziye erişmek için seçtiğiniz programlama dilini kullanırsınız.

echo $_POST['password'][1];

1
Bununla bir güvenlik sorununu saklıyorsunuz - şifrenin karması hala tarayıcının önbelleğinde saklanıyor.
Alexander Burakevych

1
Lütfen açıklığa kavuşturabilir misiniz? Parola POST kullanılarak düz metin olarak gönderilir. Okuduğum kadarıyla, POST istekleri önbelleğe alınamaz. Veri göndermek için POST kullanmanın bir alternatifi olduğunu mu söylüyorsunuz? Yoksa şifrenin tarayıcıda saklandığını mı söylüyorsunuz, çünkü şifreyi saklamıyor, ancak dizinin başındaki boş değer bu yöntemi test ettiniz mi?
Mike

0

autocompleteKabul edilen cevap da dahil olmak üzere önerilerin çoğu günümüzün web tarayıcılarında çalışmadığından (yani web tarayıcısı şifre yöneticileri yoksaymaktadır autocomplete), daha yeni bir çözüm passwordvetext türleri yapmak ve alanın arka plan renginin metin rengiyle eşleşmesini sağlamaktır. kullanıcı (veya KeePass gibi bir program) parola girerken gerçek bir parola alanı olurken parolayı saklamaya devam eden düz bir metin alanıdır. Tarayıcılar düz metin alanlarında saklanan şifreleri kaydetmeyi istemez.

Bu yaklaşımın avantajı, aşamalı geliştirmeye izin vermesi ve bu nedenle bir alanın normal bir şifre alanı olarak çalışması için Javascript gerektirmemesidir (bunun yerine düz bir metin alanıyla da başlayabilir ve aynı yaklaşımı uygulayabilirsiniz, ancak bu gerçekten HIPAA değildir PHI / PII-uyumlu). Bu yaklaşım, sunucuya gönderilmesi gerekmeyen gizli formlara / alanlara da bağlı değildir (gizli oldukları için) ve bu hilelerden bazıları da birkaç modern tarayıcıda çalışmaz.

jQuery eklentisi:

https://github.com/cubiclesoft/php-flexforms-modules/blob/master/password-manager/jquery.stoppasswordmanager.js

Yukarıdaki bağlantıdan ilgili kaynak kodu:

(function($) {
$.fn.StopPasswordManager = function() {
    return this.each(function() {
        var $this = $(this);

        $this.addClass('no-print');
        $this.attr('data-background-color', $this.css('background-color'));
        $this.css('background-color', $this.css('color'));
        $this.attr('type', 'text');
        $this.attr('autocomplete', 'off');

        $this.focus(function() {
            $this.attr('type', 'password');
            $this.css('background-color', $this.attr('data-background-color'));
        });

        $this.blur(function() {
            $this.css('background-color', $this.css('color'));
            $this.attr('type', 'text');
            $this[0].selectionStart = $this[0].selectionEnd;
        });

        $this.on('keydown', function(e) {
            if (e.keyCode == 13)
            {
                $this.css('background-color', $this.css('color'));
                $this.attr('type', 'text');
                $this[0].selectionStart = $this[0].selectionEnd;
            }
        });
    });
}
}(jQuery));

Demo:

https://barebonescms.com/demos/admin_pack/admin.php

Menüden "Giriş Ekle" yi tıklayın ve ardından sayfanın alt kısmına "Modül: Parola Yöneticisini Durdur" seçeneğine gidin.

Feragatname: Bu yaklaşım, görüş sahibi bireyler için geçerli olmakla birlikte, ekran okuyucu yazılımıyla ilgili sorunlar olabilir. Örneğin, bir ekran okuyucu düz bir metin alanı gördüğünden kullanıcının şifresini yüksek sesle okuyabilir. Yukarıdaki eklentiyi kullanmanın öngörülemeyen başka sonuçları da olabilir. Yerleşik web tarayıcısı işlevselliğini değiştirmek, çok çeşitli koşulları ve uç durumları test ederek az miktarda yapılmalıdır.


-1

Bir sitenin tarayıcıya şifreleri hatırlamayı önermemesini söylemesinin bir yolu var mı?

Web sitesi tarayıcıya kullanarak şifre olduğunu söyler <input type="password">. Yani bunu bir web sitesi perspektifinden yapmanız gerekiyorsa, bunu değiştirmeniz gerekir. (Açıkçası bunu tavsiye etmiyorum).

En iyi çözüm, kullanıcının tarayıcılarını yapılandırmasını sağlamaktır, böylece şifreleri hatırlamaz.


3
Bir girdi türü alanının değiştirilmesini önermediğiniz nasıl anlaşılıyor? Güvenlik sorunlarının ayrıntılandırılması yardımcı olacaktır.
Karl

1
@karl: şifreyi açıkta yazmak zorunda kaldığınız için "omuz sörfü" sağlar, yazarken ekrana bakarak bir parola silme işlemi.
David Schmitt

Sadece insan omuz sörfü değil, casus yazılım veya virüsler ekranınızı izleyebilir ve düz metin alanlarına yazılanları görebilir.
Karl

6
@karl: Bilgisayarınızda casus yazılım / virüs varsa, o zaman hiçbir yıldız işareti sizi kurtaramaz. Yüklü bir uygulamanın 'şifre' alanına yazılanları ele geçirmesi, düz metin alanı için aynı şeyi yapmaktan daha zor değildir.
Markus Olsson

3
Ayrıca, tarayıcı bir şifre girişi yerine normal bir metin girişi görürse, şifreyi şifre veritabanı yerine form otomatik tamamlama veritabanında saklar ... ve sonra önerebilir, hatta alakasız bir web sitesinde otomatik olarak doldurur ! Yani aslında başladığınız zamandan daha kötüsünüz.
Zwol

-1

Otomatik tamamlama bayrağına güvenmek istemiyorsanız, kullanıcının kutuyu onchange olayını kullanarak yazdığından emin olabilirsiniz. Aşağıdaki kod basit bir HTML formudur. Password_edited gizli form öğesi 0 olarak başlar. Parola değeri değiştirildiğinde, üstteki JavaScript (pw_edited işlevi) değeri 1 olarak değiştirir. Düğmeye basıldığında, formu göndermeden önce burada değer merkezi kodunu kontrol eder . Bu şekilde, tarayıcı sizi yoksayar ve alanı otomatik olarak tamamlasa bile kullanıcı, şifre alanına yazmadan oturum açma sayfasını geçiremez. Ayrıca, odak ayarlandığında şifre alanını boşalttığınızdan emin olun. Aksi takdirde, sonuna bir karakter ekleyebilir, sonra geri gidebilir ve sistemi kandırmak için kaldırabilirsiniz. Ayrıca parolaya autocomplete = "off" eklemenizi öneririm, ancak bu örnek yedekleme kodunun nasıl çalıştığını gösterir.

<html>
  <head>
    <script>
      function pw_edited() {
        document.this_form.password_edited.value = 1;
      }
      function pw_blank() {
        document.this_form.password.value = "";
      }
      function submitf() {
        if(document.this_form.password_edited.value < 1) {
          alert("Please Enter Your Password!");
        }
        else {
         document.this_form.submit();
        }
      }
    </script>
  </head>
  <body>
    <form name="this_form" method="post" action="../../cgi-bin/yourscript.cgi?login">
      <div style="padding-left:25px;">
        <p>
          <label>User:</label>
          <input name="user_name" type="text" class="input" value="" size="30" maxlength="60">
        </p>
        <p>
          <label>Password:</label>
          <input name="password" type="password" class="input" size="20" value="" maxlength="50" onfocus="pw_blank();" onchange="pw_edited();">
        </p>
        <p>
          <span id="error_msg"></span>
        </p>
        <p>
          <input type="hidden" name="password_edited" value="0">
          <input name="submitform" type="button" class="button" value="Login" onclick="return submitf();">
        </p>
      </div>
    </form>
  </body>
</html>

-1

autocomplete = "off", Firefox 31'de şifre yöneticisini devre dışı bırakmak için çalışmıyor ve büyük olasılıkla önceki bazı sürümlerde de çalışmıyor.

Mozilla'daki bu konu hakkındaki tartışmaya göz atın: https://bugzilla.mozilla.org/show_bug.cgi?id=956906

Bir belirteç tarafından oluşturulan bir defalık bir parola girmek için ikinci bir parola alanı kullanmak istedik. Şimdi şifre girişi yerine metin girişi kullanıyoruz. :-(


-1

Oturum açma adı ve şifrelerin tarayıcı tarafından otomatik olarak doldurulmasını devre dışı bırakmak için benzer bir görev verildi, çok sayıda deneme ve hatadan sonra aşağıdaki çözümü en uygun buldum. Orijinal kontrollerinizden önce aşağıdaki kontrolleri eklemeniz yeterlidir.

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

<input type="password" style="display:none">
<input type="text" name="OriginalPasswordTextBox">

IE11 ve Chrome 44.0.2403.107 için iyi çalışıyor


-2

autocomplete = "off" çoğu modern tarayıcı için çalışır, ancak Epiphany (GNOME için WebKit destekli bir tarayıcı) ile başarılı bir şekilde çalıştığım başka bir yöntem, oturum durumunda rasgele oluşturulmuş bir önek depolamaktır (veya gizli bir alanda, zaten oturum durumunda uygun bir değişken) ve alanların adını değiştirmek için bunu kullanın. Epiphany hala şifreyi kaydetmek istiyor, ancak forma geri döndüğünde alanları doldurmayacak.


Bu, onları her zamanki gibi saklamaktan bile daha kötü, çünkü şimdi kullanıcı, bir saldırganın şifreyi mağazadan çıkarmasını engellemezken parolanın kaydedildiğini görmüyor.
CodesInChaos

-2

Bu yöntemi kullanarak herhangi bir sorun yaşamadım:

Autocomplete = "off" kullanın, gizli bir şifre alanı ve ardından gizli olmayan başka bir alan ekleyin. Tarayıcı autocomplete = "off" öğesine uymuyorsa gizli olanı otomatik olarak tamamlamaya çalışır


-2

Başka bir çözüm, POST'u tüm girdilerin gizli olduğu gizli bir form kullanarak yapmaktır. Görünür form "parola" türünde giriş kullanır. İkinci form hiçbir zaman gönderilmez ve bu nedenle tarayıcı, giriş işleminin tüm işlemlerini kesemez.

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.