簡體   English   中英

屏蔽沒有 type=password 的輸入字符

[英]Masking input characters without type=password

所以我對較新的瀏覽器保存密碼有疑問。 假設我有一個這樣的密碼框:

<input type="password" autocomplete="off" />

IE11 和 iOS 7.1 中的 Safari 等新瀏覽器已經開始專門忽略密碼框中的 autocomplete="off" 並提供用戶保存密碼。 在我的公司(一家銀行),我們將此視為安全問題。

我想知道是否有人已經解決了這個問題。 也許有人寫了一個 javascript 插件來屏蔽正常的輸入[type=text],這樣 autocomplete="off" 屬性就會被尊重。

更新:

有關更多信息,請參閱 msdn 上的自動完成文檔: http://msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx

您可以使用自定義字體輸入帶有類型文本的假密碼輸入:

 @font-face { font-family: 'password'; font-style: normal; font-weight: 400; src: url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf); } input.key { font-family: 'password'; width: 100px; height: 16px; }
 <p>Password: <input class="key" type="text" autocomplete="off" /></p>

JSBin 演示

請注意,這只會引起更多的安全問題。

這是一個想法,但我建議在瀏覽器自動填充不用於登錄的密碼的情況下使用它。 可能需要一個更好的標准來識別登錄屏幕,這樣瀏覽器就不必使用啟發式方法尋找type="password"字段。

使用type="text"的密碼字段加載表單,因此瀏覽器的自動完成算法將忽略它。 當用戶在該字段中輸入內容時,切換其type="password"

我不是一個 JavaScript 程序員,但我破解了一個JSFiddle來展示它在理論上是如何工作的。

也許onfocus也是一個更好的方法,但我沒有嘗試。

對我有用的解決方案是這樣的:

第一個輸入類型應該是text

在焦點事件中將輸入類型轉為password

偵聽用戶輸入,如果輸入字段值為空,則再次將類型設置為text

這樣在開始時和輸入字段為空時瀏覽器將不會顯示建議。

首先, autocomplete = "off"應該在<form>元素上,而不是單個字段上。 這是因為瀏覽器通常將給定表單中所有字段的值存儲在一起(例如,允許為同一站點保存多個用戶名/密碼組合)。

在表單中設置它,它應該適合你。 (雖然已經保存的密碼通常仍會自動完成,因此請在測試前清除您的密碼存儲)

但是,如果這被認為是安全問題,我建議您可能正在追逐錯誤的目標。

瀏覽器提供此功能的原因是用戶希望能夠存儲他們的登錄憑據。 阻止他們這樣做並不能阻止他們這樣做,如果用戶真的想這樣做,他們仍然有很多方法可以解決這個問題——有一些瀏覽器插件明確設計用來殺死autocomplete = "off"功能並允許保存所有密碼。

您的用戶最終如何存儲密碼最終不是您的安全問題,也不是您真正可以控制的事情。

事實上,如果我們阻止人們存儲他們的密碼,他們更有可能在多個地方使用相同的密碼(僅僅是因為人們沒有能力記住他們使用的每個站點的不同密碼),因此通過防止他們從拯救它,你實際上可能使您的用戶密碼安全性較低

如果您的站點真正需要安全性而不允許保存密碼,那么您將需要完全考慮替代機制。 例如,如今的銀行登錄經常要求用戶輸入密碼中的特定數字字符——例如“請輸入密碼中的第五、第八和第十二個字符”

然而,這些方案更多地旨在保護密碼的傳輸而不是存儲它:通過只輸入某些給定的字符,我們根本不必輸入或傳輸整個密碼,因此沒有機會在途中被黑客入侵。 仍然假設用戶可能會在某處記下密碼(特別是如果他們必須計算出字符串中的第十二個字符)

這種方案對用戶來說可能是一種真正的痛苦,但確實提供了真正級別的登錄安全性,而無需實際輸入或傳輸密碼。 然而,它給登錄過程增加了額外的難度,這意味着只有像銀行這樣的真正高度安全的網站才有可能通過常規密碼使用這種方案。

您是否嘗試將 name 屬性更改為可笑的東西? 我相信自動完成功能基於 name 屬性。 我不是 100% 肯定,但在有限的測試中,我確實改變了 name 屬性,改變了所呈現的自動完成數據的類型。

顯而易見的例子是: name="username" 顯示我的用戶名,而 name="email" 顯示我以前輸入的電子郵件地址。 當我切換到 name="browsersAreStupidForImplementingThisFeature" 時,我沒有得到任何自動完成數據。

需要進一步測試,但可能是一個很好的起點? 祝你好運

我們有一個用例,管理員可以查看其他用戶記錄並進行更改。 其中一個字段是其他用戶的密碼。 在這種情況下,讓密碼管理器預先填寫該字段是一件“壞事”。 所以我們最終做的是在頁面加載后等待一小段時間,然后清除密碼字段......

// After the page has loaded...
window.addEventListener('load', setTimeout(function() {
  // Wait a bit and then clear out the contents of the field
  document.getElementById('other-password').value='';
}), 100);

我為此苦苦掙扎了很長一段時間,但這里有一個解決方案為我解決了這個問題。

最初,將密碼輸入創建為“文本”輸入:

<input type="text" name="mfa_psw" id="mfa_psw" autocomplete="off">

然后使用Javascript監聽擊鍵事件。 如果輸入的密碼不是null,將類型轉換為'password'。

<script type="text/javascript">
var pswInput = document.getElementById("mfa_psw");

pswInput.onkeyup = function(e){
    if(e.keyCode == 13){
        mfa(); // enter key pressed, call next function (i.e. log in)
        return false;
    } else {
        if (pswInput.value==null) {
            pswInput.type = 'text'; 
            // input is empty, covert to 'text' to prevent password autofil
        } else {
            pswInput.type = 'password'; 
            // input is not empty, convert to 'password' to hide text entry
        }
    }
}

注意:此解決方案確實意味着在輸入類型更改為“密碼”之前,用戶密碼的第一個字符會暴露片刻。 然而,假設用戶的密碼超過 1 個字符,這應該不是問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM