如何在主要浏览器中禁用特定输入(或表单字段)的自动完成?


当前回答

在尝试了所有解决方案之后(有些解决方案部分奏效,禁用自动填充但不自动完成,有些根本不奏效),我找到了截至2020年的最佳解决方案,将type=“search”和autocomplete=“off”添加到输入元素中。这样地:

<input type="search" /> or <input type="search" autocomplete="off" />

还要确保表单元素具有autocomplete=“off”。这非常有效,并禁用自动完成和自动填充。

此外,如果您使用type=“email”或任何其他文本类型,则需要添加autocomplete=“new email”,这将完全禁用两者。type=“password”也是如此。只需将“new-”前缀与类型一起添加到自动完成中即可。这样地:

<input type="email" autocomplete="new-email" />
<input type="password" autocomplete="new-password" />

其他回答

<form name="form1" id="form1" method="post"
      autocomplete="off" action="http://www.example.com/form.cgi">

这将在Internet Explorer和Mozilla Firefox中运行。缺点是它不是XHTML标准。

有很多答案,但大多数都是破解或某种变通方法。

这里有三个案例。

案例一:如果这是你的标准登录表单。无论如何关闭它都可能是不好的。如果你真的需要这样做,请仔细考虑。用户习惯于浏览器记住和存储密码。在大多数情况下,你不应该改变这种标准行为。

如果你仍然想这样做,请参阅案例三

案例二:如果这不是您的常规登录表单,但输入的名称或id属性不是“像”电子邮件、登录名、用户名、用户名和密码。

Use

<input type="text" name="yoda" autocomplete="off">

案例三:如果这不是您的常规登录表单,但输入的名称或id属性是“类似”电子邮件、登录名、用户名、用户名和密码。

例如:登录,abc_login,密码,some_password,password_field。

所有浏览器都带有密码管理功能,可以记住密码或建议使用更强的密码。他们就是这样做的。

然而,假设你是一个网站的管理员,可以创建用户并设置他们的密码。在这种情况下,您不希望浏览器提供这些功能。

在这种情况下,autocomplete=“off”将不起作用。使用autocomplete=“新密码”

<input type="text" name="yoda" autocomplete="new-password">

有用链接:

https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion

这是自2021 5月起适用于所有浏览器的完美解决方案!

TL;博士

将输入字段名和字段ID重命名为非相关的名称,如“data_input_field_1”。然后添加&#8204;将字符插入标签的中间。这是一个非打印字符,因此您不会看到它,但它会诱使浏览器无法识别需要自动完成的字段,因此不会显示内置的自动完成小部件!

详细信息

几乎所有浏览器都使用字段的名称、id、占位符和标签的组合来确定字段是否属于一组地址字段,这些字段可以从自动完成中受益。因此,如果您有一个类似<input type=“text”id=“address”name=“street_address”>的字段,几乎所有浏览器都会将该字段解释为地址字段。因此,浏览器将显示其内置的自动完成小部件。梦想是使用属性autocomplete=“off”可以工作,不幸的是,现在大多数浏览器都不遵守请求。

因此,我们需要使用一些技巧来使浏览器不显示内置的自动完成小部件。我们这样做的方式是欺骗浏览器,使其相信该字段根本不是地址字段。

首先,将id和name属性重命名为不会泄露您正在处理的地址相关数据的属性。因此,与其使用<input type=“text”id=“city input”name=“city”>,不如使用类似的方式。浏览器不知道data_input_field_3代表什么。但你知道。

如果可能,不要使用占位符文本,因为大多数浏览器也会考虑到这一点。如果你必须使用占位符文本,那么你就必须发挥创意,确保你没有使用任何与地址参数本身相关的单词(如City)。使用类似“输入位置”的方法可以实现此目的。

最后一个参数是附加到字段的标签。然而,如果你像我一样,你可能希望保持标签完整,并向用户显示可识别的字段,如“地址”、“城市”、“州”、“国家”。好吧,好消息:你可以!实现这一点的最佳方法是插入零宽度非联接字符&#8204;,作为标签中的第二个字符。因此,将<label>City</label>替换为<label>C&#8204;城市</label>。这是一个非打印字符,因此您的用户将看到City,但浏览器将被欺骗,无法识别该字段!

任务完成!如果一切顺利,浏览器应该不再在这些字段上显示内置的地址自动完成小部件!

不幸的是,大多数浏览器都删除了此选项,因此无法禁用密码提示。

直到今天,我还没有找到解决这个问题的好办法。我们现在剩下的是希望有一天这种选择会回来。

可以说,我想要一种可以将现场管理完全从浏览器手中拿走的东西。在本例中,有一个标准的文本输入字段来捕获密码-没有电子邮件、用户名等。。。

<input id='input_password' type='text' autocomplete='off' autofocus>

有一个名为“input”的变量,设置为空字符串。。。

var input = "";

jQuery监视字段事件。。。

聚焦时,始终清除字段内容和关联的“输入”变量。在按键时,任何字母数字字符以及一些定义的符号都会附加到“input”变量,并且字段输入会替换为项目符号。此外,当按下Enter键时,键入的字符(存储在“input”变量中)将通过Ajax发送到服务器。(请参阅下面的“服务器详细信息”。)在设置键时,Home、End和Arrow键会刷新“input”变量和字段值。(我可能会对箭头导航和焦点事件产生兴趣,并使用.selectionStart来确定用户单击或正在导航的位置,但不值得为密码字段付出努力。)此外,按下Backspace键会相应地截断变量和字段内容。


$("#input_password").off().on("focus", function(event) {
    $(this).val("");
    input = "";

}).on("keypress", function(event) {
    event.preventDefault();

    if (event.key !== "Enter" && event.key.match(/^[0-9a-z!@#\$%&*-_]/)) {
        $(this).val( $(this).val() + "•" );
        input += event.key;
    }
    else if (event.key == "Enter") {
        var params = {};
        params.password = input;

        $.post(SERVER_URL, params, function(data, status, ajax) {
            location.reload();
        });
    }

}).on("keyup", function(event) {
    var navigationKeys = ["Home", "End", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"];
    if ($.inArray(event.key, navigationKeys) > -1) {
        event.preventDefault();
        $(this).val("");
        input = "";
    }
    else if (event.key == "Backspace") {
        var length = $(this).val().length - 1 > 0 ? $(this).val().length : 0;
        input = input.substring(0, length);
    }
});

前端摘要

本质上,这使浏览器无法捕获任何有用的内容。即使它覆盖了自动完成设置,和/或显示了一个包含先前输入值的下拉列表,它也只存储字段值的项目符号。


服务器详细信息(可选阅读)

如上所示,一旦服务器返回JSON响应,JavaScript就会执行location.reload()。(此登录技术用于访问受限制的管理工具。与cookie内容相关的一些过度使用可以被跳过,以实现更广泛的实现。)以下是详细信息:

当用户导航到站点时,服务器会查找合法的cookie。如果没有任何cookie,将显示登录页面。当用户输入密码并通过Ajax发送,服务器确认密码并检查以查看用户的IP地址是否在授权IP地址列表中。如果无法识别密码或IP地址,则服务器不会生成cookie,因此当页面重新加载时,用户会看到相同的登录页面。如果密码和IP地址都被识别,服务器将生成cookie具有十分钟的使用寿命,它还存储与时间帧和IP地址相对应的两个加扰值。当页面重新加载时,服务器会找到cookie并验证加扰值是正确的(即时间帧与cookie的日期相对应并且IP地址相同)。每当用户与服务器交互时,无论他们是登录、显示数据还是更新记录,都会重复验证和更新cookie的过程。如果cookie的值始终正确,服务器将显示完整的网站(如果用户正在登录)或满足提交的任何显示或更新请求。如果在任何时候cookie的值不正确,服务器会删除当前cookie,然后在重新加载时,会导致登录页面重新显示。