浏览器如何知道何时提示用户保存密码?

Eri*_*ric 79 browser firefox login

这与我在这里问的问题有关: 如何让浏览器提示保存密码?

这是问题:我无法让我的浏览器提示我保存我正在开发的网站的密码.(我说的是有时当你在Firefox上提交表单时出现的栏,上面写着"记住yoursite.com的密码?是/现在/从不")

这是非常令人沮丧的,因为Firefox(以及大多数其他现代浏览器,我希望以类似的方式工作)的这一功能似乎是一个谜.这就像浏览器所做的一个神奇技巧,它会查看您的代码,或者您提交的内容,或者某些东西,如果它"看起来"像一个带有用户名(或电子邮件地址)字段和密码字段的登录表单,它提供保存.

除非在这种情况下,在他们使用我的登录表单后,它没有向我的用户提供该选项,这让我很疯狂.:-)

(我检查了我的Firefox设置 - 我没有告诉浏览器"从不"这个网站.它应该是提示.)

我的问题

Firefox使用什么启发式来了解何时应该提示用户保存?这应该不难回答,因为它就在Mozilla源代码中(我不知道在哪里看,否则我会尝试自己挖掘它).我也没有幸运地从Mozilla开发者那里找到博客文章或其他类似开发人员的说明.

(我会很好地回答这个问题用于Safari或IE;我会想象所有浏览器都使用非常相似的规则,所以如果我能在其中一个中使用它,那么它将适用于其他浏览器.)

(*请注意,如果您对我的回答与cookie,加密或其他任何关于我如何在我的本地数据库中存储密码的问题有关,很可能你误解了我的问题.:-)

bta*_*bta 53

根据我读过的内容,我认为Firefox通过form.elements[n].type == "password"(遍历所有表单元素)检测密码,然后通过在密码字段之前搜索文本字段的表单元素来检测用户名字段(此处有更多信息).您可以在Javascript中尝试类似的操作,看看您是否可以检测到您的密码字段.

据我所知,您的登录表单需要成为一部分,<form>否则Firefox将无法检测到它.id="password"在密码字段上设置可能也不会受到伤害.

如果这仍然给你带来很多问题,我建议你询问一下Mozilla项目的开发人员邮件列表(你甚至可能会得到设计该功能的开发人员的回复).

  • @ 1.21gigawatts-根据我的知识,没有"标准"的方法来做到这一点,所以不同的浏览器可能会略有不同.我不知道Chrome的流程与Firefox有什么不同,但是如果你查看Chrome源代码,你可以搞清楚.我知道Firefox如何做到的唯一方法是阅读他们的代码.这是某人需要在大图表中记录的东西,列出每个浏览器如何做到这一点...... (3认同)
  • 密码管理器代码的作者将引导您完成2013年博客文章中的内容 - 这是值得一读的:https://blog.mozilla.org/dolske/2013/08/20/on-firefoxs-password-manager/ (3认同)
  • 这太棒了.谢谢.这就是我在寻找的东西. (2认同)
  • 更新了密码管理器博客帖子的链接:https://dolske.wordpress.com/2013/08/ (2认同)

小智 17

我有同样的问题,并找到了解决方案:

  1. 要使浏览器要求存储密码,用户名和密码框必须是一个表格,并且该表格必须实际提交.提交按钮可能会从onclick处理程序返回false(因此提交实际上不会发生).

  2. 要使浏览器恢复以前存储的密码,输入框必须存在于主HTML表单中,而不是通过javascript动态创建.可以使用display:none创建表单.

需要注意的是,密码在页面加载后立即填充并在整个会话期间出现在那里,因此可以通过注入的javascript读取:它使这种攻击更加糟糕.为避免这种情况,转发到单独的页面只是为了登录是合理的,它解决了您开始阅读本主题的所有问题:).作为部分解决方案,我在提交表单时清除字段 - 如果用户注销并想再次登录,则密码不会被浏览器填写,但这对我来说很小.

Viliam



Nic*_*tin 10

您应该查看Mozilla Password Manager调试页面和扩展编写nsILoginManager文档(仅适用于Firefox如何处理密码管理的细节技术细节).您可以深入了解那里的答案以及链接到那里的其他页面,以了解您可能想知道密码管理器如何与站点和扩展进行交互.

(特别是在密码管理器调试文档中指出,请确保您的html中没有自动完成设置为off,因为这将禁止保存用户名和密码的提示)


1.2*_*tts 6

这似乎适用于Mac上的Firefox,Chrome和Safari.未在Windows上测试过.

<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>
Run Code Online (Sandbox Code Playgroud)

这需要添加到页面中.它无法动态添加.表单和iframe可以设置为display:none.如果您没有设置iframe的src,则在您提交表单至少一次之前,提示将不会显示.

然后调用表单submit():

bridgeForm.submit();
Run Code Online (Sandbox Code Playgroud)

该动作可以是可选的,并且自动完成可以是可选的.没有测试过.

注意:在某些浏览器上,在浏览器响应之前,表单必须在服务器(而不是localhost而不是文件系统)上运行.

所以这:

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

不是这个:

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

  • 不适用于我...在铬(一年后) (2认同)

小智 6

使用angular,chrome,firefox为我工作:(我已经搜索并测试了几个小时 - 对于chrome,表单动作参数(#)就是答案.@ 1.21 gigawatts,谢谢!!!你的答案非常宝贵.)

形成

firefox 30.0 - 不需要隐藏的iframe和提交按钮(如下所示),但需要"login-form-autofill-fix"指令来识别自动填充的凭证,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

隐藏的iframe

chrome 35.0 - 不需要上面的指令,但需要隐藏的iframe和真实表单上的提交按钮.隐藏的iframe看起来像

<iframe src="emptyPageForLogin.html" id="emptyPageForLogin" name="emptyPageForLogin" style="display:none"></iframe>
Run Code Online (Sandbox Code Playgroud)

角度指令(使用jqLit​​e)

这与角1.2.18一起使用

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);
});
Run Code Online (Sandbox Code Playgroud)

修订

  • 经过一些测试,我意识到,chrome通过角度登录方法(200ms)需要稍微超时 - 看起来,重定向有时对于密码管理器来说太快了.
  • 更好地清除browsercache ......随着每一次改变