最近项目上要求做到这一点,在网上搜了一圈,发现都是不完美的,不兼容全部的浏览器,于是只能自己摸索了,最终得出了终极解决方案:

涉及:

disabled 或 readonly

display:none;   隐藏用,隐藏后不占位置

visibility:hidden;   隐藏用,隐藏后占原来的位置

position:absolute;z-index:-1;   隐藏用,隐藏与否取决于z-index相对的值,这里的-1是我自己用的

autocomplete:"off";

网上说,这个属性有时失效,有个解决办法是将off改为new-password。

还有个说法(来自MDN),之所以new-password能够解决off失效的原因是autocomplete属性的有效值只有on和off,默认值是on,

如果autocomplete的属性是除on和off外的值,那么就是个无效值,那么浏览器就会放弃对该属性的执行。

换句话说,除on和off外的任一值,可以随便编都行。

在这里,我用off就够了,测试过程中没遇到失效的情况,所以暂时用off。

代码如下:

(最简洁)

<input type="text" name="name" value="admin" style="position: absolute;z-index: -1;" disabled autocomplete = "off"/><!-- 这个username会被浏览器记住,我随便用个admin-->
<input type="password" name="pwd" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/><!-- 这前面两个name属性要不要和真正的一样,具体自己调试下 -->
<p><input type="text" maxlength="20" placeholder="用户名" id="name" name="name" autocomplete = "off"/></p>
<p><input type="password" maxlength="20" placeholder="密码" id="pwd" name="pwd" autocomplete = "off"/></p>
<p><input type="text" maxlength="4" placeholder="验证码" id="vcode" name="vcode" autocomplete = "off"/><img id="vcode" title="点击更换验证码" /></p>
<p><input type="button" value="登录" id="login"/></p>
<p style="visibility: hidden;"><input type="password" name="pwd" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/></p><!-- 这个password的值会被浏览器记住,我随便用个空格 -->


<input type="text" value="admin" style="position: absolute;z-index: -1;" disabled autocomplete = "off"/><!-- 这个username会被浏览器记住,我随便用个admin-->
<input type="password" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/>
<input type="text" name="name" style="display: none;" disabled autocomplete = "off"/><!-- 这里的autocomplete可以不要 -->
<input type="password" name="pwd" style="display: none;" disabled autocomplete = "off"/><!-- 这里的autocomplete可以不要 -->
<p><input type="text" maxlength="20" placeholder="用户名" id="name" name="name" autocomplete = "off"/></p>
<p><input type="password" maxlength="20" placeholder="密码" id="pwd" name="pwd" autocomplete = "off"/></p>
<p><input type="text" maxlength="4" placeholder="验证码" id="vcode" name="vcode" autocomplete = "off"/><img id="vcode" title="点击更换验证码" /></p>
<p><input type="button" value="登录" id="login"/></p>
<p style="visibility: hidden;"><input type="password" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/></p><!-- 这个password的值会被浏览器记住,我随便用个空格 -->

测试的浏览器:
ie浏览器(7~11,edge),360安全浏览器(全部模式),360极速浏览器(全部模式),谷歌浏览器,火狐浏览器,猎豹浏览器

分析以上代码的原因:

有的浏览器会自动记录登录的账号,并且会记录第一个用户名和最后一个密码input。

对360安全浏览器,单数个的话360安全浏览器不会出现提示是否要保存密码。

disabled:和360浏览器、页面第一个聚焦点有关。

改进过程:

一开始是在真正要用到的用户名密码input前面加两个对应name的隐藏用户名密码input,用于对付浏览器的自动填充表单。

但是,这个方案有个缺点:浏览器会记住登录的账号(有的浏览器会提示是否要记住),每当填写密码时(不用tab切换到,直接用鼠标获得焦点),

会提示是否使用以下密码。这样别人不仅仅能够登录,并且还可以知道密码的明文(浏览器审查元素改密码input的type为text或在浏览器设置上查看保存的用户名密码)

经过N次的测试,发现= =浏览器只会记住第一个用户名input的值和最后一个密码input 的值,并且这些input不能用display:none。

于是在上面的基础上,在前和后增加另一种隐藏方式的一组用户名密码input:用position:absolute;z-index:-1; 来隐藏

问题解决了,但是出现了一个小问题:360安全浏览器会提示是否记住密码,并且,最重要的是,是输入密码的时候,还会提示是否使用以下项的密码。

又经过N次的测试,发现,单数的input时,360安全浏览器不会再弹出是否记住密码的提示。

最后发现,把最开始加的两个display:none去掉也行,并且也是单数的input。

ok,完美。

结论:

<input type="text" value="admin" style="position: absolute;z-index: -1;" disabled autocomplete = "off"/><!-- 这个username会被浏览器记住,我随便用个admin-->
<input type="password" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/>
<p><input type="text" maxlength="20" placeholder="用户名" id="name" name="name" autocomplete = "off"/></p>
<p><input type="password" maxlength="20" placeholder="密码" id="pwd" name="pwd" autocomplete = "off"/></p>
<p><input type="text" maxlength="4" placeholder="验证码" id="vcode" name="vcode" autocomplete = "off"/><img id="vcode" title="点击更换验证码" /></p>
<p><input type="button" value="登录" id="login"/></p>
<p style="visibility: hidden;"><input type="password" value=" " style="position: absolute;z-index: -1;" disabled autocomplete = "off"/></p><!-- 这个password的值会被浏览器记住,我随便用个空格 -->

PS:z-index的值和autocomplete的值根据实际情况来调整。

对于具体的情况,每个人会有不同的表单,可能会出现布局啊什么的不完美,
可以根据添加一组或多组display:none 的用户名密码input和在input的外层加个<p style="visibility: hidden;"></p> 来调整显示!

如果是表单,一样的道理,这里不多说了。(注意要在表单里面加input)

如果不是登录页面,而是其他的页面,如修改密码的页面,可以用小招:在旧密码input前面加个隐藏的密码input

<input type="password" style="display: none;" disabled autocomplete = "off"/>

如果其他的页面,不只有密码,还有用户名input,那么与修改密码页面一样,在前面加多个用户名密码input组合即可

<input type="text" style="display: none;" disabled autocomplete = "off"/>
<input type="password" style="display: none;" disabled autocomplete = "off"/>

或者(推荐)

<input type="text" name="username" style="display: none;" disabled autocomplete = "off"/>
<input type="password" name="password" style="display: none;" disabled autocomplete = "off"/>
又或者(推荐)

<input type="text" id="username" style="display: none;" disabled autocomplete = "off"/>
<input type="password" id="password" style="display: none;" disabled autocomplete = "off"/>

这里临时的text和password要和真实的text、password的name或id值要一样!!!
如:临时text的id值和真实的text的name值一样,或临时text的name值和真实的name值一样等等!!!

最后小tip:

每次登陆时(按回车或者点击登录),都将真正的用户名密码input置空比较好,处于安全考虑

web安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案的更多相关文章

  1. 快Key:按一下鼠标【滚轮】,帮你自动填写用户名密码,快速登录,可制作U盘随身(开源免费-附安装文件和源代码)

    * 代码以本文所附下载文件包为准,安装文件和源文件包均在本文尾部可下载. * 快Key及本文所有内容仅供交流使用,使用者责任自负,由快Key对使用者及其相关人员或组织造成的任何损失均由使用者自负,与本 ...

  2. servlet方式通过Cookie记住登录时的用户名和密码

    1.建立web工程 2.创建存放servlet的包 3右键包,新建servlet,路径将前面的servlet去掉,只需要doPost和doGet方法 编写servlet CookieServlet.j ...

  3. 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充

    一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...

  4. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

  5. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...

  7. 让VS2010记住TFS的登陆用户名和密码

    用VS进行团队开发的都知道,每次打开VS连接TFS的时候,都要提示输入用户名和密码,每次都这样无疑感觉太多此一举了(当然你不想别人操作你的电脑就直接进入项目就没必要这么做),为了像连接远程那样可以记住 ...

  8. WEB学习笔记12-高可读性的HTML之如何正确设计表单

    网站中的用户登录.注册.用户调查等都是通过页面中的表单提交到网站服务器的.假设要实现让用户设置个人信息的一个表单. 该表格为两栏布局,第一栏中的文本左对齐,第二栏的表单控件右对齐,构成了最容易实现的表 ...

  9. 自动输入用户名和密码用于telnet的shell

    http://blog.sina.com.cn/s/blog_45497dfa0100l4cf.html

随机推荐

  1. centos7进入救援模式,修复错误配置

    因某些修改操作,导致系统重启后无法正常启动,此时可进入救援模式,修复错误配置即可. OS:centos 7 1.重启系统后,进入grup引导页面,选中第一项然后按“e” 进入编辑模式: 2.通过↓键找 ...

  2. 运行/调试你的PHP代码

    前言 没有任何一名程序员可以一气呵成.完美无缺的在不用调试的情况下完成一个功能或模块.调试实际分很多种情况.本篇文章我分享下自己在实际开发工作中的经验,我个人理解,调试分三种,注意我所讲的是调试并非测 ...

  3. Flask蓝图基本使用

    Flask蓝图基本使用 Flask通过使用蓝图将视图函数模块化,使应用显得更加规整 比如我们的应用的视图函数包括用户相关和文章相关,那么我们可以通过建立两个py文件分别存储两类视图函数 user.py ...

  4. codechef营养题 第三弹

    第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...

  5. 理解 LARGE_INTEGER的定义

    http://bbs.csdn.net/topics/310239341 #if defined(MIDL_PASS) typedef struct _LARGE_INTEGER { #else // ...

  6. leetcode算法学习----155. 最小栈(MinStack )

    下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...

  7. JAVA之中出现无法加载主类的情况解决方法

    j今天打代码的时候出现了无法加载主类的情况,我就收集了一些,java无法加载主类的方法 ava无法加载主类解决办法 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,class文件下 ...

  8. Ubuntu 16.04安装设备管理器Hardinfo和lshw设备信息命令

    安装: sudo apt-get install hardinfo 启动: 实际上这些信息都可以通过lshw进行查看,参考:https://linux.die.net/man/1/lshw

  9. [转]C++回调函数(callback)的使用

    原文地址:http://blog.sina.com.cn/s/blog_6568e7880100p77y.html 什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递fo ...

  10. spring mvc参数校验

    一.在SringMVC中使用 使用注解 1.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-validator-4.2.0.Fina ...