Nonaktifkan fungsionalitas 'Simpan Kata Sandi' browser

423

Salah satu kegembiraan bekerja di lembaga layanan kesehatan pemerintah adalah harus berurusan dengan semua paranoia dalam berurusan dengan PHI (Informasi Kesehatan yang Dilindungi). Jangan salah paham, saya melakukan semua yang mungkin untuk melindungi informasi pribadi orang (kesehatan, keuangan, kebiasaan berselancar, dll.), Tetapi kadang-kadang orang menjadi agak terlalu gelisah.

Contoh kasus: Salah satu pelanggan negara bagian kami baru-baru ini mengetahui bahwa browser menyediakan fitur praktis untuk menyimpan kata sandi Anda. Kita semua tahu bahwa itu sudah ada di sana untuk sementara waktu dan sepenuhnya opsional dan terserah pengguna akhir untuk memutuskan apakah itu keputusan cerdas untuk digunakan atau tidak. Namun, ada sedikit kegemparan saat ini dan kami dituntut untuk menemukan cara untuk menonaktifkan fungsi itu untuk situs kami.

Pertanyaan : Apakah ada cara bagi situs untuk memberi tahu browser agar tidak menawarkan untuk mengingat kata sandi? Saya sudah menjelajahi web sejak lama, tetapi tidak tahu bahwa saya pernah menemukan itu sebelumnya.

Bantuan apa pun dihargai.

mattsmith321
sumber
6
Anda harus memberikan skrip greasemonkey sehingga orang dapat mengaktifkannya kembali. Saya tidak berpikir pengguna suka dipaksa mengetikkan kata sandi setiap kali ...
ThiefMaster
14
Pertanyaannya layak mendapat dukungan karena berguna dan jelas. Di sisi lain saya tidak ingin orang menemukan solusi untuk "masalah" ini.
Ian Boyd
11
Ini tidak selalu merupakan "masalah". Saya datang ke sini karena firefox meminta untuk menyimpan kata sandi untuk formulir yang berisi kata sandi WiFi / SSID, bukan formulir nama pengguna / kata sandi masuk. Ini sangat menjengkelkan dan saya ingin menghentikannya.
srd
1
Jika informasi itu sangat penting, itu harus dilindungi oleh lebih dari sekedar kata sandi.
Sam Watkins
Salah satu cara tampaknya berhasil adalah tidak menggunakan <form>. Jika Anda menggunakan javascript untuk mengirim data (XHR), maka Anda tidak memerlukannya. Saya ingin menonaktifkan sistem yang menggunakan otentikasi "kata sandi satu kali" (tidak ada alasan untuk menyimpannya). Untuk otentikasi pengguna / pass saya tidak akan merekomendasikan untuk menonaktifkan fitur itu.
lepe

Jawaban:

322

Saya tidak yakin apakah itu akan berfungsi di semua browser tetapi Anda harus mencoba mengatur autocomplete = "off" pada formulir.

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

Cara termudah dan termudah untuk menonaktifkan formulir dan penyimpanan kata sandi meminta dan mencegah data formulir tidak di-cache dalam riwayat sesi adalah dengan menggunakan atribut elemen formulir autocomplete dengan nilai "off".

Dari http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion

Beberapa penelitian kecil menunjukkan bahwa ini berfungsi di IE tetapi saya tidak akan memberikan jaminan;)

@ Joseph : Jika ini merupakan persyaratan ketat untuk lulus validasi XHTML dengan markup yang sebenarnya (tidak tahu mengapa itu terjadi), Anda secara teoritis dapat menambahkan atribut ini dengan javascript setelah itu tetapi kemudian pengguna dengan js dinonaktifkan (mungkin jumlah pengguna Anda yang diabaikan) atau nol jika situs Anda memerlukan js) masih menyimpan kata sandi mereka.

Contoh dengan jQuery:

$('#loginForm').attr('autocomplete', 'off');
Markus Olsson
sumber
48
Hanya komentar singkat, karena ini berubah, HTML5 menambahkan atribut autocomplete ke spec, jadi valid sekarang.
Tyler Egeto
11
Untuk diketahui, Microsoft memutuskan untuk menghormati bahwa Internet Explorer 11 tidak akan lagi autocomplete="off"untuk input type="password"bidang. msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx
JW Lim
6
Sama seperti @JWLim menyebutkan IE 11 menjatuhkan dukungan untuk menonaktifkan fungsionalitas penyimpanan kata sandi, demikian juga Firefox. bugzilla.mozilla.org/show_bug.cgi?id=956906
Gregory Cosmo Haun
3
Firefox (sayangnya) mengikuti petunjuk Microsoft dan "menghapus" dukungan autocomplete juga. Untuk detail, lihat komentar 100 dalam diskusi masalah berikut: bugzilla.mozilla.org/show_bug.cgi?id=956906
Bouncing Bit
8
Sekarang, tidak berfungsi untuk Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
Illuminator
44

Sebagai tambahannya

autocomplete="off"

Menggunakan

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

untuk input yang Anda tidak ingin mereka untuk mengingat data formulir ( username, password, dll) seperti yang ditunjukkan di bawah ini:

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

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

Diuji pada versi terbaru dari browser utama yaitu Google Chrome, Mozilla Firefox, Microsoft Edge, dll dan bekerja seperti pesona. Semoga ini membantu.

Murat Yıldız
sumber
2
@Murat Yıldız: Saya harus menerapkan yang sama dan saya mengikuti kode Anda. Ini berfungsi dengan baik untuk saya di semua browser. Terima kasih !
Sree
1
@Sayalah Saya senang itu membantu Anda :)
Murat Yıldız
3
Baru saja menguji Mozilla Firefox 52.0 , Google Chrome 57.0 , Microsoft Edge 38.1 dan bekerja seperti pesona! ..
Murat Yıldız
1
Mungkin ada kesalahan di Safari mobile karena jawaban ini memperbaikinya stackoverflow.com/questions/2530/…
Ferie
1
Windows Firefox 57.0.2 (64-bit) masih menyarankan untuk menyimpan kata sandi setelah saya menerapkan ini.
Panu Haaramo
37

Saya telah berjuang dengan masalah ini beberapa saat, dengan twist unik untuk masalah ini. Pengguna yang diberi hak istimewa tidak dapat membuat kata sandi yang disimpan berfungsi untuk mereka, tetapi pengguna normal membutuhkannya. Ini berarti pengguna istimewa harus login dua kali, yang kedua kalinya tidak ada kata sandi yang disimpan.

Dengan persyaratan ini, autocomplete="off"metode standar tidak berfungsi di semua browser, karena kata sandi mungkin telah disimpan dari login pertama. Seorang kolega menemukan solusi untuk mengganti bidang kata sandi saat itu difokuskan dengan bidang kata sandi baru, dan kemudian fokus pada bidang kata sandi baru (kemudian menghubungkan event handler yang sama). Ini berhasil (kecuali itu menyebabkan loop tak terbatas di IE6). Mungkin ada jalan keluarnya, tapi itu menyebabkan saya menderita migrain.

Akhirnya, saya mencoba hanya memasukkan nama pengguna dan kata sandi di luar formulir. Yang mengejutkan saya, ini berhasil! Ini bekerja pada IE6, dan versi Firefox dan Chrome di Linux saat ini. Saya belum mengujinya lebih lanjut, tetapi saya menduga itu berfungsi di sebagian besar jika tidak semua browser (tapi itu tidak akan mengejutkan saya jika ada browser di luar sana yang tidak peduli jika tidak ada formulir).

Berikut adalah beberapa kode contoh, bersama dengan beberapa jQuery untuk membuatnya berfungsi:

<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>
Mike Stone
sumber
1
Itu terlihat seperti solusi yang bagus. Masuk akal karena formulir yang Anda kirim tidak dengan sendirinya menyertakan kata sandi. Saya kira untuk memastikan Anda bisa memiliki dua bentuk, yang pertama hanya untuk memastikan bahwa nama pengguna dan kata sandi terlihat di semua browser.
Alexis Wilke
3
Saya suka solusi Anda dan menerapkan yang serupa di situs saya, konyol bagaimana saat ini, browser tidak menawarkan cara sederhana untuk menyelesaikan ini.
AgelessEssence
Tidak yakin apakah itu karena saya terjebak menggunakan jquery 1.6, tetapi jquery di atas hanya berfungsi setelah membungkus $ (dokumen) .ready (function () {});
rgbflawed
Satu-satunya soultion yang benar adalah ini karena beberapa browser tidak akan menerima autocomplete = "off" lagi!
Abadis
1
Saya baru saja mencoba metode ini pada chrome, opera, dan internet explorer dan tampaknya berhasil, tetapi tidak bekerja dengan Firefox secara tidak sengaja
chenks
29

Yah, itu posting yang sangat tua, tapi tetap saya akan memberikan solusi saya, yang telah lama berusaha dicapai oleh tim saya. Kami baru saja menambahkan bidang tipe input = "kata sandi" baru di dalam formulir dan membungkusnya dalam div dan membuat div tersebut disembunyikan. Pastikan div ini sebelum input kata sandi yang sebenarnya. Ini berhasil bagi kami dan tidak memberikan opsi Simpan Kata Sandi

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;}
whyAto8
sumber
1
Satu keuntungan dari cara ini vs yang menggunakan input tersembunyi adalah bahwa dengan cara ini kata sandi tidak pernah disimpan dalam bidang teks biasa
pvgoddijn
@ whyAto8 Ini tidak berfungsi untuk saya di Chrome 47.0.2526.111 ... trik untuk membuatnya berfungsi adalah dengan menambahkan teks bidang lain di div tersembunyi. Peramban meminta untuk menyimpan kata sandi TETAPI berbunyi "Apakah Anda yakin akan menyimpan crendetial ini?" dan kemudian menampilkan nama pengguna dan kata sandi kosong. Ini berhasil.
David Bélanger
1
solusi whyAto8 bersama dengan komentar @David Bélanger bekerja untuk saya (tidak ada solusi lain yang melakukannya). Saya juga harus menyebutkan bahwa saya menambahkan dua bidang kosong yang tersembunyi SEBELUM yang benar-benar digunakan untuk entri data, dan bidang yang digandakan (tersembunyi) memiliki nama masing-masing yang sama. Dengan cara ini Chrome (48.0.2564.103) bahkan tidak bertanya apakah ada kata sandi yang harus disimpan.
Vadim
Tidak ada kombinasi dari ini yang berfungsi pada Chrome 48.0.2564.116. Bahkan dikombinasikan dengan komentar DavidBelanger, popup Chrome yang meminta Anda untuk menyimpan kata sandi masih menyimpan kata sandi jika Anda mengklik ok
ChrisO
Jawaban yang bagus .. Tolong beri tahu saya mengapa Anda mengatakan "Pastikan div ini sebelum input kata sandi yang sebenarnya" ? Saya meletakkan div itu setelah input kata sandi yang sebenarnya dan masih berfungsi .. Jadi mengapa Anda menyebutkan itu?
Martin AJ
16

Anda dapat mencegah peramban mencocokkan formulir dengan mengacak nama yang digunakan untuk bidang kata sandi pada setiap pertunjukan. Kemudian browser melihat kata sandi untuk url yang sama, tetapi tidak dapat memastikan kata sandinya sama . Mungkin itu mengendalikan sesuatu yang lain.

Pembaruan: perhatikan bahwa ini harus ditambahkan ke menggunakan autocomplete atau taktik lain, bukan pengganti untuk mereka, karena alasan yang ditunjukkan oleh orang lain.

Perhatikan juga bahwa ini hanya akan mencegah browser menyelesaikan kata sandi secara otomatis. Ini tidak akan mencegahnya menyimpan kata sandi di tingkat arbitrase apa pun yang dipilih peramban untuk digunakan.

Joel Coehoorn
sumber
5
[@ Joel] (# 32409) yang mungkin mencegah formulir agar tidak terisi secara otomatis tetapi apakah itu akan mencegah browser dari saat meminta untuk menyimpan kata sandi untuk formulir yang seharusnya ini ?
Joseph Pecoraro
3
Saya tidak percaya ini akan berhasil sekarang. Dalam FF 13, saya memiliki formulir dengan beberapa bidang kata sandi, semuanya dengan nama yang berbeda. FF, setelah menyimpan kata sandi untuk halaman itu, menempelkan kata sandi yang disimpan ke dalam SEMUA bidang kata sandi. Tidak peduli apa nama bidangnya (saya punya "new_password" dan "old_password" misalnya, dan kata sandi yang disimpan akan dibuang ke keduanya). Dalam bentuk khusus ini saya tidak memiliki nama pengguna untuk menyimpan kata sandi - hanya dua bidang kata sandi, dalam kasus yang membuat perbedaan.
Jason
1
Nods @Jason, memberikan bidang kata sandi UUID baru untuk sebuah nama setiap kali tidak mengalahkan upaya browser untuk mengisinya.
FP Freely
14

Gunakan otentikasi dua faktor nyata untuk menghindari ketergantungan tunggal pada kata sandi yang mungkin disimpan di lebih banyak tempat daripada cache browser pengguna.

David Schmitt
sumber
2
btw itu otentikasi bukan otentikasi
Jonathan.
26
@Jonathan Pity, saya lebih suka otentikasi
Ian Boyd
Solusi lain dapat menerapkan JavaScript, yang dengan paksa menutup browser setelah pengguna keluar dari aplikasi. Ini akan menghapus seluruh memori browser, dan karenanya tidak ada data yang dapat diambil dari memori browser.
Ajay Takur
13

Cara terbersih adalah menggunakan autocomplete="off"atribut tag tetapi Firefox tidak mematuhinya dengan benar ketika Anda berpindah bidang dengan Tab.

Satu-satunya cara Anda bisa menghentikan ini adalah dengan menambahkan bidang kata sandi tersembunyi palsu yang menipu peramban untuk mengisi kata sandi di sana.

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

Ini adalah hack yang jelek, karena Anda mengubah perilaku browser, yang seharusnya dianggap praktik buruk. Gunakan hanya jika Anda benar-benar membutuhkannya.

Catatan: ini akan secara efektif menghentikan pengisian otomatis kata sandi, karena FF akan "menyimpan" nilai #prevent_autofill(yang kosong) dan akan mencoba untuk mengisi setiap kata sandi yang disimpan di sana, karena selalu menggunakan type="password"input pertama yang ditemukannya di DOM setelah masing-masing "nama pengguna" memasukkan.

venimus
sumber
Apa gunanya mencegah browser dari mengisi kata sandi tetapi membiarkannya menyimpannya? Ini hanya menipu pengguna untuk berpikir bahwa kata sandi mereka tidak disimpan sementara mereka sebenarnya rentan.
CodesInChaos
Dengan cara ini ia tidak akan benar-benar menyimpan kata sandi Anda, karena Anda mengetik ke dalam kotak lain, yang diabaikan oleh FF. Sebaliknya itu akan menyimpan string kosong.
Venimus
@CodesInChaos IMHO Anda harus mempertimbangkan kembali downvote Anda, karena kekhawatiran Anda tidak valid
venimus
12

Saya telah menguji bahwa menambahkan autocomplete = "off" dalam bentuk tag di semua browser utama. Bahkan, sebagian besar orang di AS menggunakan IE8 sejauh ini.

  1. IE8, IE9, IE10, Firefox, Safari berfungsi dengan baik.

    Browser tidak meminta "simpan kata sandi". Juga, nama pengguna & kata sandi yang disimpan sebelumnya tidak terisi.

  2. Chrome & IE 11 tidak mendukung fitur autocomplete = "off"
  3. FF yang mendukung pelengkapan otomatis = "off". tetapi terkadang kredensial tersimpan yang ada diisi.

Diperbarui pada 11 Juni 2014

Akhirnya, di bawah ini adalah solusi lintas browser menggunakan javascript dan berfungsi dengan baik di semua browser.

Perlu menghapus tag "form" di form login. Setelah validasi sisi klien, masukkan kredensial itu dalam bentuk tersembunyi dan kirimkan.

Juga, tambahkan dua metode. satu untuk validasi "validateLogin ()" dan satu lagi untuk mendengarkan acara enter sambil klik enter di kotak teks / kata sandi / tombol "checkAndSubmit ()". karena sekarang formulir masuk tidak memiliki tag formulir, jadi masuk acara tidak berfungsi di sini.

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

Semoga berhasil!!!

Asik
sumber
Meskipun jawaban ini memberikan informasi yang bermanfaat, itu tidak benar-benar menjawab pertanyaan tentang cara menghentikan browser dari menyimpan kata sandi.
JW Lim
@ JW Lim, saya telah memperbarui jawabannya. Silakan melihatnya. Terima kasih!
Asik
@Sivakumar, Ok tolong sertakan OS dan versi Safari. sehingga orang lain sadar akan hal yang sama. itu bekerja di sistem saya (windows 8, Safary 5)
Asik
@ Asik Safari 8.0.3 dan Mac OS 10.10
Sivakumar
7

Tidak juga - satu-satunya hal yang secara realistis dapat Anda lakukan adalah menawarkan saran di situs; mungkin, sebelum masuk pertama kali, Anda dapat menunjukkan kepada mereka formulir dengan informasi yang menunjukkan bahwa mereka tidak mengijinkan browser untuk menyimpan kata sandi.

Kemudian pengguna akan segera mengikuti saran, menuliskan kata sandi pada catatan post-it dan menempelkannya ke monitor mereka.

Jason Bunting
sumber
10
Anda harus ingat ini adalah situs pemerintah , dan hal-hal seperti itu dibebankan secara politis. Jika seseorang dari atas berkata, "itu tidak boleh bekerja seperti ini", maka apa yang realistis bukanlah bagian dari persamaan. Masalahnya mungkin dipindahkan ke catatan Post-It, tetapi kebijakan tentang itu adalah untuk departemen yang berbeda untuk menangani - masalahnya telah dipindahkan ;-) Dan saya benar-benar serius.
Jason
6

Apa yang telah saya lakukan adalah kombinasi dari autocomplete = "off" dan membersihkan bidang kata sandi menggunakan javascript / jQuery.

Contoh jQuery:

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

Dengan menggunakan setTimeout()Anda dapat menunggu browser untuk menyelesaikan bidang sebelum Anda menghapusnya, jika tidak browser akan selalu lengkap setelah Anda menghapus bidang.

Howard Young
sumber
3

jika autocomplete = "off" tidak berfungsi ... hapus tag form dan gunakan tag div sebagai gantinya, kemudian berikan nilai form menggunakan jquery ke server. Ini berhasil untuk saya.

Nikhil Dinesh
sumber
3

Karena autocomplete = "off" tidak berfungsi untuk bidang kata sandi, seseorang harus mengandalkan javascript. Inilah solusi sederhana berdasarkan jawaban yang ditemukan di sini.

Tambahkan atribut data-password-autocomplete = "off" ke bidang kata sandi Anda:

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

Sertakan JS berikut:

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

Solusi ini berfungsi untuk Chrome dan FF.

mfernandes
sumber
Windows Firefox 57.0.2 (64-bit) masih menyarankan untuk menyimpan kata sandi setelah saya menerapkan ini.
Panu Haaramo
2

Supaya orang sadar - atribut 'pelengkapan otomatis' berfungsi sebagian besar waktu, tetapi pengguna yang kuat dapat mengatasinya menggunakan bookmarklet.

Memiliki browser menyimpan kata sandi Anda sebenarnya meningkatkan perlindungan terhadap keylogging, jadi mungkin opsi paling aman adalah menyimpan kata sandi di browser tetapi melindunginya dengan kata sandi utama (setidaknya di Firefox).

Ditarik
sumber
2
"tetapi kekuatan pengguna dapat mengatasinya" - yang berlaku untuk sebagian besar fitur aplikasi, web atau tidak, dan seharusnya tidak menjadi alasan untuk membatasi sistem. Orang-orang juga dapat menulis kata sandi mereka di post-it dan meletakkannya di monitor mereka, Anda hanya dapat melakukan banyak hal untuk keamanan dari perspektif aplikasi, dan memberikan perilaku default yang bermakna (bukan menyimpannya secara lokal) adalah permulaan.
Niels Keurentjes
2

Saya punya pekerjaan di sekitar, yang dapat membantu.

Anda dapat membuat retasan font khusus. Jadi, buat font khusus, dengan semua karakter sebagai titik / lingkaran / bintang misalnya. Gunakan ini sebagai font khusus untuk situs web Anda. Periksa bagaimana melakukan ini di inkscape: bagaimana membuat font Anda sendiri

Kemudian pada form login Anda gunakan:

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

Kemudian tambahkan css Anda:

@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';
}

Browser yang cukup kompatibel. Saya sudah mencoba IE6 +, FF, Safari dan Chrome. Pastikan saja font oet yang Anda konversi tidak rusak. Semoga ini bisa membantu?

Dai Bok
sumber
1
solusi yang sangat rapi ada font kata sandi di sini
andrew
6
Jika Anda menggunakan solusi seperti itu, Anda perlu mempertimbangkan bahwa pengguna dapat dengan bebas menyalin teks yang dimasukkan ke dalam bidang kata sandi yang mirip ini. Fungsi salin dan potong dinonaktifkan pada bidang kata sandi nyata.
2

Cara paling sederhana untuk mengatasi masalah ini adalah dengan menempatkan bidang INPUT di luar tag FORMULIR dan menambahkan dua bidang tersembunyi di dalam tag FORMULIR. Kemudian di ajukan pendengar acara sebelum data formulir dikirimkan ke nilai salin server dari input yang terlihat ke yang tidak terlihat.

Berikut ini sebuah contoh (Anda tidak dapat menjalankannya di sini, karena tindakan formulir tidak disetel ke skrip login nyata):

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

lutut-cola
sumber
Windows Firefox 57.0.2 (64-bit) masih menyarankan untuk menyimpan kata sandi setelah saya menerapkan ini.
Panu Haaramo
baik, ini hanya retasan, yang mungkin berhenti bekerja kapan saja :)
knee-cola
ini pilihan terbaik! cukup kosongkan bidang kata sandi sebelum mengirimkan: $ ('. kata sandi'). val ('')
ebelendez
2

Solusi js (jquery) saya adalah mengubah jenis input kata sandi menjadi teks pada formulir kirim . Kata sandi bisa terlihat selama sedetik, jadi saya juga menyembunyikan input sebelum itu. Saya lebih suka tidak menggunakan ini untuk formulir login , tetapi ini berguna (bersama dengan autocomplete = "off") misalnya di dalam bagian administrasi situs web.

Coba letakkan ini di dalam konsol (dengan jquery), sebelum Anda mengirimkan formulir.

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

Diuji pada Chrome 44.0.2403.157 (64-bit).

ovalek
sumber
1
Ini sebenarnya berfungsi. Ini mencegah browser menyimpan kata sandi. Untuk mencegah menampilkan kata sandi, Anda bisa membungkus bidang input dalam div tersembunyi. Dan Anda sudah bisa melakukan ini jika DOM dimuat, tidak perlu menunggu sampai Anda mengirimkan formulir.
Ferry Kranenburg
Bekerja pada IE 11.0.9600.18161!
Lu55
Itu benar. Sekarang saya mencoba ini di FF 44.0.2 dan peretasan ini tidak berfungsi lagi ... sungguh memalukan. Di Chrome ini masih berfungsi.
ovalek
Anda dapat mengganti input [type = submit] atau tombol [type = submit] dengan tombol reguler [type = button] dan lakukan ini di penangan onclick. Jika tidak ada [type = submit] dalam formulir, itu juga akan mencegah formulir dikirimkan dengan tombol enter dan prompt penyimpanan kata sandi tidak muncul.
Steven Don
2

Saya menguji banyak solusi. Nama bidang kata sandi dinamis, beberapa bidang kata sandi (tidak terlihat untuk kata sandi palsu), mengubah jenis input dari "teks" menjadi "kata sandi", autocomplete = "off", autocomplete = "new-password", ... tetapi tidak ada yang menyelesaikannya dengan yang terbaru browser.

Untuk menghilangkan kata sandi ingat, saya akhirnya memperlakukan kata sandi sebagai bidang input, dan "mengaburkan" teks yang diketik.

Itu kurang "aman" daripada bidang kata sandi asli karena memilih teks yang diketik akan menampilkannya sebagai teks yang jelas, tetapi kata sandi tidak diingat. Itu juga tergantung pada apakah Javascript diaktifkan.

Anda akan memperkirakan risiko menggunakan opsi mengingat proposal dan kata sandi di bawah ini dari navigator.

Meskipun mengingat kata sandi dapat dikelola (disbaled per situs) oleh pengguna, itu baik untuk komputer pribadi, bukan untuk komputer "umum" atau bersama.

Saya pikir ini untuk ERP yang berjalan di komputer bersama, jadi saya akan mencobanya untuk solusi saya di bawah ini.

<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">
Cedric Simon
sumber
1

Markus mengangkat poin yang bagus. Saya memutuskan untuk mencari autocompleteatribut dan mendapatkan yang berikut:

Satu-satunya downside untuk menggunakan atribut ini adalah bahwa itu tidak standar (berfungsi di browser IE dan Mozilla), dan akan menyebabkan validasi XHTML gagal. Saya pikir ini adalah kasus di mana masuk akal untuk membatalkan validasi. ( sumber )

Jadi saya harus mengatakan bahwa meskipun tidak bekerja 100%, itu ditangani di browser utama sehingga ini solusi yang bagus.

Joseph Pecoraro
sumber
Saya mengalami masalah ini untuk memvalidasi sesuai standar w3c. Masalahnya adalah saya ingin fungsi ini untuk situs web Mobile banking. Saya berasumsi bahwa peramban seluler cukup ketat dan terkadang dapat mengacaukan formulir jika beberapa atribut yang tidak valid digunakan. Apa yang Anda rekomendasikan dalam kasus ini?
asgs
2
Saya pikir itu adalah gaya berpikir lama. Banyak peramban seluler terkini dibuat dari WebKit dan mendukung atau mengabaikan atribut ini dengan anggun. Saya tidak mengetahui bagaimana negara lain, atau browser di ponsel yang lebih tua menangani hal ini, tetapi dengan anggun menangani atribut / elemen yang tidak dikenal merupakan dasar bagi browser yang baik. Ini "bukti masa depan" browser untuk tidak pecah saat web berevolusi. Mungkin tertinggal (tidak menerapkan fitur baru) tetapi tidak akan rusak. Harapan itu membantu =)
Joseph Pecoraro
1
Itu seharusnya bukan komentar untuk jawaban yang dirujuk daripada jawaban untuk pertanyaan itu sendiri.
viam0Zah
1

Saya mencoba di atas autocomplete="off"dan belum ada yang berhasil. Jika Anda menggunakan js sudut, rekomendasi saya adalah pergi dengan tombol dan ng-klik.

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

Ini sudah memiliki jawaban yang diterima dan menambahkan ini jika seseorang tidak dapat menyelesaikan masalah dengan jawaban yang diterima dia dapat pergi dengan mekanisme saya.

Terima kasih atas pertanyaan dan jawabannya.

Lasitha Benaragama
sumber
ini jelas berhenti menekan tombol enteratau returnuntuk mengirim formulir.
8eecf0d2
0

Salah satu cara saya tahu adalah menggunakan (misalnya) JavaScript untuk menyalin nilai dari bidang kata sandi sebelum mengirimkan formulir.

Masalah utama dengan ini adalah solusinya terkait dengan JavaScript.

Kemudian lagi, jika itu dapat dikaitkan dengan JavaScript Anda mungkin juga hash kata sandi di sisi klien sebelum mengirim permintaan ke server.

Huppie
sumber
Hashing di sisi klien bukan pengganti hashing di sisi server. Saya tidak yakin apakah itu membantu sama sekali (jika dilakukan sebagai tambahan).
Brilliand
2
Membiarkan hashing di sisi klien berbahaya karena itu berarti penyerang tidak perlu memecahkan kata sandi dari hash, mereka hanya dapat menggunakan hash untuk login. Hash menjadi setara dengan kata sandi.
rjmunro
Saya setuju dengan Brilliand bahwa hash pada klien hanya berguna jika Anda juga memiliki hash di server sebelum menyimpan kata sandi di database Anda. Namun, memiliki hash di sisi klien dapat membantu sejumlah masalah dengan pria di tengah. Ini dikatakan, karena kode akan tersedia (setidaknya di situs publik) untuk peretas, mungkin tidak berguna seperti kelihatannya.
Alexis Wilke
0

Masalah sebenarnya jauh lebih dalam daripada hanya menambahkan atribut ke HTML Anda - ini adalah masalah keamanan umum, itu sebabnya orang menemukan kunci perangkat keras dan hal-hal gila lainnya untuk keamanan.

Bayangkan Anda memiliki autocomplete = "off" yang berfungsi dengan baik di semua browser. Apakah itu membantu keamanan? Tentu tidak. Pengguna akan menuliskan kata sandi mereka di buku teks, pada stiker yang terpasang pada monitor mereka di mana setiap pengunjung kantor dapat melihatnya, menyimpannya ke file teks pada desktop dan sebagainya.

Secara umum, aplikasi web dan pengembang web tidak bertanggung jawab atas keamanan pengguna akhir. Pengguna akhir hanya dapat melindungi diri mereka sendiri. Idealnya, mereka HARUS menyimpan semua kata sandi di kepala mereka dan menggunakan fungsi reset kata sandi (atau administrator kontak) jika mereka lupa. Kalau tidak, selalu akan ada risiko bahwa kata sandi dapat dilihat dan dicuri.

Jadi, apakah Anda memiliki kebijakan keamanan gila dengan kunci perangkat keras (seperti, beberapa bank menawarkan untuk internet-banking yang pada dasarnya menggunakan otentikasi dua faktor) atau pada dasarnya TANPA KEAMANAN. Yah, ini agak berlebihan tentu saja. Penting untuk memahami apa yang Anda coba lindungi:

  1. Tidak ada akses yang diizinkan. Bentuk login paling sederhana sudah cukup. Terkadang ada tindakan tambahan yang diambil seperti pertanyaan keamanan acak, CAPTCHA, pengerasan kata sandi dll.
  2. Mengendus kredensial. HTTPS adalah HARUS jika orang mengakses aplikasi web Anda dari hotspot Wi-Fi publik dll. Sebutkan bahwa bahkan memiliki HTTPS, pengguna Anda perlu mengubah kata sandi mereka secara teratur.
  3. Serangan orang dalam. Ada dua contoh seperti itu, mulai dari mencuri kata sandi Anda dari browser atau yang telah Anda tulis di suatu tempat di meja (tidak memerlukan keterampilan TI) dan berakhir dengan sesi penempaan dan penyadapan lalu lintas jaringan lokal (bahkan dienkripsi) dan selanjutnya mengakses aplikasi web seperti halnya pengguna akhir lainnya.

Dalam postingan khusus ini, saya dapat melihat persyaratan yang tidak memadai diberikan pada pengembang yang tidak akan pernah dapat dia selesaikan karena sifat masalahnya - keamanan pengguna akhir. Poin subjektif saya adalah bahwa pengembang pada dasarnya harus mengatakan TIDAK dan menunjuk pada masalah persyaratan daripada membuang-buang waktu untuk tugas-tugas tersebut, jujur. Ini tidak benar-benar membuat sistem Anda lebih aman, melainkan akan mengarah ke kasing dengan stiker di monitor. Sayangnya, beberapa bos hanya mendengar apa yang ingin mereka dengar. Namun, jika saya adalah Anda, saya akan mencoba menjelaskan dari mana masalah sebenarnya berasal, dan autocomplete = "off" tidak akan menyelesaikannya kecuali itu akan memaksa pengguna untuk menyimpan semua kata sandi mereka secara eksklusif di kepala mereka! Pengembang pada akhirnya tidak dapat melindungi pengguna sepenuhnya,

ruruskyi
sumber
0

Menghadapi masalah HIPAA yang sama dan menemukan solusi yang relatif mudah,

  1. Buat bidang kata sandi tersembunyi dengan nama bidang sebagai array.

    <input type="password" name="password[]" style="display:none" />
    
  2. Gunakan array yang sama untuk bidang kata sandi yang sebenarnya.

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

Browser (Chrome) dapat meminta Anda untuk "Simpan kata sandi" tetapi terlepas dari apakah pengguna memilih menyimpan, saat berikutnya mereka masuk kata sandi akan secara otomatis mengisi bidang kata sandi yang disembunyikan, slot nol dalam array, membiarkan slot 1 kosong.

Saya mencoba mendefinisikan array, seperti "kata sandi [part2]" tetapi masih diingat. Saya pikir itu membuangnya jika ini adalah array yang tidak terindeks karena tidak punya pilihan selain menjatuhkannya di tempat pertama.

Kemudian Anda menggunakan bahasa pemrograman pilihan Anda untuk mengakses array, PHP misalnya,

echo $_POST['password'][1];
Mike
sumber
1
Dengan ini Anda menyembunyikan masalah keamanan - hash kata sandi masih disimpan dalam cache browser.
Alexander Burakevych
1
Bisakah Anda menjelaskan? Kata sandi akan dikirim sebagai teks biasa menggunakan POST. Sejauh yang saya baca, permintaan POST tidak bisa di-cache. Apakah Anda mengatakan ada alternatif untuk menggunakan POST untuk mengirim data? Atau apakah Anda mengatakan bahwa kata sandi disimpan di browser, karena kata sandi tersebut tidak menyimpan kata sandi tetapi nilai kosong di awal array, sudahkah Anda menguji metode ini?
Mike
0

Karena sebagian besar autocompletesaran, termasuk jawaban yang diterima, tidak berfungsi di peramban web saat ini (mis. Pengelola kata sandi peramban web abaikan autocomplete), solusi yang lebih baru adalah menukar antara passworddantext mengetik dan membuat warna latar belakang cocok dengan warna teks saat bidang adalah bidang teks biasa, yang terus menyembunyikan kata sandi saat menjadi bidang kata sandi nyata saat pengguna (atau program seperti KeePass) memasukkan kata sandi. Browser tidak meminta untuk menyimpan kata sandi yang disimpan dalam bidang teks biasa.

Keuntungan dari pendekatan ini adalah ia memungkinkan untuk peningkatan progresif dan karenanya tidak memerlukan Javascript untuk bidang berfungsi sebagai bidang kata sandi normal (Anda juga bisa mulai dengan bidang teks biasa dan menerapkan pendekatan yang sama tetapi itu tidak benar-benar HIPAA Sesuai PHI / PII). Pendekatan ini juga tidak bergantung pada formulir / bidang tersembunyi yang mungkin belum tentu dikirim ke server (karena mereka tersembunyi) dan beberapa trik itu juga tidak berfungsi baik di beberapa browser modern.

Plugin jQuery:

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

Kode sumber yang relevan dari tautan di atas:

(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

Klik "Tambah Entri" di menu dan kemudian gulir ke bagian bawah halaman untuk "Modul: Hentikan Kata Sandi Manajer".

Penafian: Meskipun pendekatan ini bekerja untuk individu yang terlihat, mungkin ada masalah dengan perangkat lunak pembaca layar. Misalnya, pembaca layar mungkin membaca kata sandi pengguna dengan keras karena melihat bidang teks biasa. Mungkin juga ada konsekuensi lain yang tidak terduga dari penggunaan plugin di atas. Mengubah fungsi browser web bawaan harus dilakukan hemat dengan menguji berbagai kondisi dan kasus tepi.

CubicleSoft
sumber
-1

Apakah ada cara bagi situs untuk memberi tahu browser agar tidak menawarkan untuk mengingat kata sandi?

Situs web memberi tahu browser bahwa itu adalah kata sandi dengan menggunakan <input type="password">. Jadi jika Anda harus melakukan ini dari perspektif situs web maka Anda harus mengubahnya. (Jelas saya tidak merekomendasikan ini).

Solusi terbaik adalah membuat pengguna mengkonfigurasi browser mereka sehingga tidak akan mengingat kata sandi.

Joseph Pecoraro
sumber
3
Bagaimana jelas bahwa Anda tidak merekomendasikan mengubah bidang jenis input? Elaborasi masalah keamanan akan sangat membantu.
Karl
1
@karl: karena harus mengetikkan kata sandi di tempat terbuka memungkinkan "selancar bahu", proses mengumpulkan kata sandi dengan melihat layar ketika sedang diketik.
David Schmitt
Bukan hanya selancar bahu manusia, tetapi spyware atau virus dapat menonton layar Anda dan melihat apa yang telah diketik dalam bidang plaintext.
Karl
6
@karl: Jika Anda memiliki spyware / virus di komputer Anda maka tidak ada jumlah perlindungan asterisk yang akan menyelamatkan Anda. Aplikasi yang diinstal tidak lebih sulit untuk mencegat apa yang sedang diketik ke dalam bidang 'kata sandi' daripada melakukan hal yang sama untuk bidang teks biasa.
Markus Olsson
3
Juga, jika peramban melihat input teks biasa dan bukannya input kata sandi, kemungkinan akan menyembunyikan kata sandi dalam bentuk database autocomplete alih-alih basis data kata sandi ... dan kemudian menyarankan atau bahkan mengisinya secara otomatis di beberapa situs web yang tidak terkait! Jadi, Anda sebenarnya lebih buruk daripada ketika Anda mulai.
zwol
-1

Jika Anda tidak ingin mempercayai tanda autocomplete, Anda dapat memastikan bahwa pengguna mengetik di kotak menggunakan event onchange. Kode di bawah ini adalah formulir HTML sederhana. Unsur formulir tersembunyi password_edited mulai diatur ke 0. Ketika nilai kata sandi diubah, JavaScript di bagian atas (fungsi pw_edited) mengubah nilai menjadi 1. Ketika tombol ditekan, ia memeriksa kode pemberi nilai di sini sebelum mengirimkan formulir . Dengan begitu, meskipun peramban mengabaikan Anda dan melengkapi secara otomatis bidang tersebut, pengguna tidak dapat melewati halaman login tanpa mengetikkan bidang kata sandi. Selain itu, pastikan untuk mengosongkan bidang kata sandi saat fokus ditetapkan. Jika tidak, Anda dapat menambahkan karakter di bagian akhir, lalu kembali dan menghapusnya untuk mengelabui sistem. Saya sarankan menambahkan autocomplete = "off" ke kata sandi sebagai tambahan, tetapi contoh ini menunjukkan cara kerja kode cadangan.

<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>
Tom
sumber
-1

autocomplete = "off" tidak berfungsi untuk menonaktifkan pengelola kata sandi di Firefox 31 dan kemungkinan besar tidak di beberapa versi sebelumnya juga.

Lihat diskusi di mozilla tentang masalah ini: https://bugzilla.mozilla.org/show_bug.cgi?id=956906

Kami ingin menggunakan bidang kata sandi kedua untuk memasukkan kata sandi satu kali yang dihasilkan oleh token. Sekarang kami menggunakan input teks daripada input kata sandi. :-(

Andreas Stankewitz
sumber
-1

Saya diberi tugas serupa untuk menonaktifkan pengisian otomatis nama login dan kata sandi oleh browser, setelah banyak percobaan dan kesalahan saya menemukan solusi di bawah ini menjadi optimal. Cukup tambahkan kontrol di bawah ini sebelum kontrol asli Anda.

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

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

Ini berfungsi baik untuk IE11 dan Chrome 44.0.2403.107

Sheiky
sumber
-2

autocomplete = "off" berfungsi untuk sebagian besar peramban modern, tetapi metode lain yang saya gunakan yang bekerja dengan sukses dengan Epiphany (peramban yang didukung WebKit untuk GNOME) adalah menyimpan awalan yang dibuat secara acak dalam keadaan sesi (atau bidang tersembunyi, kebetulan saya memiliki variabel yang cocok dalam status sesi sudah), dan gunakan ini untuk mengubah nama bidang. Epiphany masih ingin menyimpan kata sandi, tetapi ketika kembali ke formulir itu tidak akan mengisi kolom.

Peter Nelson
sumber
Itu bahkan lebih buruk daripada menyimpannya dengan cara biasa, karena sekarang pengguna tidak melihat bahwa kata sandi disimpan sementara tidak mencegah penyerang mengekstrak kata sandi dari toko.
CodesInChaos
-2

Saya belum punya masalah menggunakan metode ini:

Gunakan autocomplete = "off", tambahkan bidang kata sandi tersembunyi dan kemudian yang tidak tersembunyi. Browser mencoba untuk secara otomatis menyelesaikan yang tersembunyi jika tidak menghormati autocomplete = "off"

Spechal
sumber
-2

Solusi lain adalah membuat POST menggunakan formulir tersembunyi di mana semua input bertipe tersembunyi. Formulir yang terlihat akan menggunakan input tipe "kata sandi". Formulir yang terakhir tidak akan pernah dikirimkan dan oleh karena itu browser tidak dapat memotong sama sekali operasi login.

Lord of the Goo
sumber