web安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案
最近项目上要求做到这一点,在网上搜了一圈,发现都是不完美的,不兼容全部的浏览器,于是只能自己摸索了,最终得出了终极解决方案:
涉及:
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安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案的更多相关文章
- 快Key:按一下鼠标【滚轮】,帮你自动填写用户名密码,快速登录,可制作U盘随身(开源免费-附安装文件和源代码)
* 代码以本文所附下载文件包为准,安装文件和源文件包均在本文尾部可下载. * 快Key及本文所有内容仅供交流使用,使用者责任自负,由快Key对使用者及其相关人员或组织造成的任何损失均由使用者自负,与本 ...
- servlet方式通过Cookie记住登录时的用户名和密码
1.建立web工程 2.创建存放servlet的包 3右键包,新建servlet,路径将前面的servlet去掉,只需要doPost和doGet方法 编写servlet CookieServlet.j ...
- 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充
一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...
- 让VS2010记住TFS的登陆用户名和密码
用VS进行团队开发的都知道,每次打开VS连接TFS的时候,都要提示输入用户名和密码,每次都这样无疑感觉太多此一举了(当然你不想别人操作你的电脑就直接进入项目就没必要这么做),为了像连接远程那样可以记住 ...
- WEB学习笔记12-高可读性的HTML之如何正确设计表单
网站中的用户登录.注册.用户调查等都是通过页面中的表单提交到网站服务器的.假设要实现让用户设置个人信息的一个表单. 该表格为两栏布局,第一栏中的文本左对齐,第二栏的表单控件右对齐,构成了最容易实现的表 ...
- 自动输入用户名和密码用于telnet的shell
http://blog.sina.com.cn/s/blog_45497dfa0100l4cf.html
随机推荐
- PHP+Python,轻量维护超轻松
window下安装Python 直接去Python官网下载msi安装程序安装即可(选择自定义安装才能修改程序安装路径哦) widows下Python的数据库访问模块PyMysql的安装 1.open ...
- calculate Cp history (from Fluent) using Matlab
input data : unscaled time history of moment/thrust from ANSYS fluent example of input data, "m ...
- linux设置系统时间与各种阻塞
前阵子做了一个P2P的通信系统,发现开机的时候和中间运行的时候会莫名报错,这个问题找了好久,后来从日志中看出来,所有节点上阻塞的操作同时超时. 而在超时左右,有新节点自动加入系统. 在新节点加入系统的 ...
- 用记事本写第一个Java程序
public class Welcome{ public static void main(String[] args){ System.out.println("我是尚学堂的高淇,很高兴认 ...
- JavaSE 学习笔记之IO流(二十二)
IO流:用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节 ...
- CentOS服务器上部署 oracle10gr2
1.下载Centos系统 Linux 镜像文件. 推荐使用 CentOS5.4,下载地址:http://isoredirect.centos.org/centos/5/isos/i38 ...
- [luoguP3047] [USACO12FEB]附近的牛Nearby Cows(DP)
传送门 dp[i][j][0] 表示点 i 在以 i 为根的子树中范围为 j 的解 dp[i][j][1] 表示点 i 在除去 以 i 为根的子树中范围为 j 的解 状态转移就很好写了 ——代码 #i ...
- 爬虫——使用ItemLoader维护item
在item的Filed()中设置参数函数,可以用来预处理item字段的数据,另一方面也方便程序代码的管理和重用 item中 from scrapy.loader.processors import M ...
- PatentTips - Method for booting a host device from an MMC/SD device
FIELD OF THE INVENTION The present invention relates to a memory device and especially to the interf ...
- UIColor用自定义颜色,TableView去掉背景色
1.用mac系统自带的数码测色计,选RGB模式,将值添加到ColorWithRed:xxx.0/255 最后的alpha选1.0 2.TableView的背景色要用setBackgroundView的 ...