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

涉及:

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. 求数组差/交集函数-php数组函数(二)

    求数组差集函数 函数只检查了多维数组中的一维.可以用 array_diff($array1[0], $array2[0]) 检查更深的维度. u:自定义函数比较,a(association):同时比较 ...

  2. 【jenkins】UnicodeEncodeError: 'ascii' codec can't encode character

    https://stackoverflow.com/questions/6076203/how-do-you-set-the-default-encoding-in-jenkins

  3. Extract local angle of attack on wind turbine blades

    Extract local angle of attack on wind turbine blades Table of Contents 1. Extract local angle of att ...

  4. BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)

    我: "立个flag 14点之前调完这题" 洛谷AC时间: 2019-06-24 14:00:16 实力打脸... 网络流板子从来写不对系列 题目链接: (BZOJ) https: ...

  5. [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  6. 使用java操作hbase(单节点)

    1.在运行java代码之前,一定要先启动Hbase,很重要!!    cd /home/cx/itcast/hbase-1.2.6/bin   ./start-hbase.sh 2.新建一个java项 ...

  7. 进入DRF和ANGULAR的整合学习,这三篇入门内容一定要学好的

    看来,DJANGO的模板功能是无法用啦, 学着用ANGLUAR的SERVICE,MODULE,CONTROLLER啦... http://engineroom.trackmaven.com/blog/ ...

  8. -- > define的用法与学习(1)

    在不久之前,我一直不理解为神马大家在做题时经常用define来代替某些函数,或者用来直接定义某些极大的变量.It is not until today that I understand why it ...

  9. Ubuntu 16.04安装PDF阅读器FoxitReader

    下载: https://www.foxitsoftware.cn/downloads/ 安装: tar zxvf FoxitReader2.4.1.0609_Server_x64_enu_Setup. ...

  10. ORA-15024: discovered duplicately numbered ASM disk 0

    在尝试删除一个diskgroup的时候遇到这个错误. ORA-15024: discovered duplicately numbered ASM disk 0 这说明oracle认为有两个disk ...