WEB安全实战(六)防止浏览器记住用户名和密码

写文章之前,先向大家认个错,其实这篇文章以及下一篇将要写的文章都应该是在上个月完成的。但是吧,由于一些原因,没有来的及写完。因此,现在把上个月欠下的债先补上。废话不多说,直接上内容。

问题

做过 Web 开发的童鞋们都知道,打开网站之后,一般都是需要输入用户名、密码的。然而,就是这简单的操作,在提交的时候,就可能会暴露一些问题,当然,这些问题是会被安全漏洞测试软件检测出来的。如果没有做过相关的处理,那么表单、页面或者本地的 Cookie 中都是会留有一些敏感信息,这些敏感信息都可能会被黑客利用的。下面就简单的谈一谈如何避免这样的问题出现。

解决方案

下面列出了几个比较常用的解决方案,都有各自的优缺点,和不同的适用场景,先大概的看一下吧:

Ⅰ、 针对浏览器记住密码

首先大部分浏览器都是根据表单域的type="password"来判断密码域的,所以针对这种情况可以采取“动态设置密码域”的方法:

代码如下:

<span style="font-family:Comic Sans MS;"><input type="text" name="password" onfocus="this.type='password'" /> </span>

注:当这个文档框获取焦点时才将其变成密码域,这样浏览器就不会记住密码,当然为了更加完善,还可以把autocomplete="off"属性也加上。

Ⅱ、在 onload 事件,把密码框的值清空,即:

代码如下:

<span style="font-family:Comic Sans MS;"><script language="javascript">
window.load = function(){
document.getElementById('密码域ID').value='';
};
</script> </span>

注:或者使用 jQuery 对应的方法。

Ⅲ、页面采用https协议,因为https是不会对表单进行保存信息的。

Ⅳ、采用flash做登录表单,这种情况浏览器也不会记录表单信息。

Ⅴ、再来个变态的好了,就是可以把 type="password" 改成 type="text",因为 type 不是 password 就不会出现记住密码功能,然后设置一个变量如:var val="" 或者是设置一个隐藏域 <input type="hidden" name="val">,最后用 onpropertychange 把密码换成一行圆点,并把值赋给 val,提交时再把 val
的值还原回去,由于效果和 * 号一样,用户是看不出来的。

对比

那么,问题来了,如果项目已经开发结束,并且正在进行测试阶段,遇到这样的问题之后,那么你不可能再去重构代码了,而是所谓的打补丁,通过补丁来解决这个漏洞。那么,可用的方案就是 I 和 Ⅱ了,当然,如果你不怕麻烦,那么推荐使用 Ⅳ 和 Ⅴ了。

第 Ⅲ 种方案肯定是不行的,因为项目中的协议已经在开发结束的时候就确定了,如果事先留有接口的话,那就容易的多了。不过,这需要一个好的设计才能实现。

当你选择第Ⅰ种方案的时候,你会发现,其实还是有问题的,因为我在做的时候,就已经测试过了,第 Ⅰ 种方案在 IE 10 及以上版本都不会有问题,但在 IE 10 以下的版本就出现了明文,this.type=‘password‘ 完全不起作用。如果你的项目中需要 IE 多个版本的兼容性的话,这种方案就被 pass 了。

而至于第Ⅱ种方案,通过测试你就会发现,其实它的作用是锦上添花,搭配第Ⅰ种方案一起使用还是可以的,不过第Ⅰ种方案已经被 pass 了,仅仅使用第Ⅱ种方案也只是治标不治本,所以,一样 pass 。

如果项目在开发中,那么第Ⅲ种、第Ⅳ种方案可以尝试一下。

而我选择的解决方案,则是使用第Ⅴ种,这种方式是使用 JS 实现的,通过文本框获得焦点后,把文本框进行替换成密码框,这种方式在各版本的 IE 中都是可以做到的。而且,如果您的项目正在开发的阶段,那么,我推荐您使用这种方式,在以后的维护中,也不会有后顾之忧的。

至于代码嘛,这里就不贴了,都不难,而且网上也都有。如果有需要的可以私信给我,我会把代码发给您。

结束语

对于整个 Web 安全体系中,这个漏洞并不算是致命的,这里提一下也只是让大家有个认识,补漏洞不是我们的目的,重要的是如何在开发中避免出现这样的漏洞,所谓“防患于未然”,就是这个道理。

时间: 2024-08-24 16:20:39

WEB安全实战(六)防止浏览器记住用户名和密码的相关文章

防止浏览器记住用户名及密码

如何设置能禁止浏览器自动保存表单信息,比如用户名,密码? 现在很多浏览器都有自动填写功能,我在input上使用了autocomplete="off",但在有的浏览器上还是被记住了用户名跟密码,请问有没有更有效及简便的方法来防止浏览器记住用户名及密码? 1.针对浏览器记住密码 1).首先大部分浏览器都是根据表单域的type="password"来判断密码域的,所以针对这种情况可以采取“动态设置密码域”的方法: <input type="text&quo

XSS攻击:获取浏览器记住的明文密码

作者:余弦(@evilcos) 0x01. XSS获取明文密码的多种方式 我已经感受到Web潮流带来的巨大革新,尤其是最近HTML5越来越火.浏览器们在客户端瓜分着这个Web OS,只要是对用户体验好的功能,浏览器之间就会互相学习,然后去实现,但是实现总是存在一些差异,有些差异是用户体验上的,有些则可能带来安全问题. 这篇文章是想深入描述下浏览器记住用户密码这种机制带来的安全问题与实现上的一些差异性.黑客们如何通过技巧获取到浏览器保存的密码,明文. 先回到XSS本身上,XSS获取明文密码的方式有

Android:SharedPreferences 记住用户名和密码

参考:http://blog.csdn.net/liuyiming_/article/details/7704923 SharedPreferences介绍: SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置参数,它是采用xml文件存放数据的,文件存放在"/data/data<package name>/shared_prefs"目录下. SharedPreferences的用法: 由于SharedPreferences是

ios中DEBUG中记住用户名和密码

- (void)viewDidLoad { [super viewDidLoad]; #ifdef DEBUG // 设置测试使用的用户名和密码 self.nameText.text = @“xiaoshuai"; self.pwdText.text = @"123"; [self textChanged]; #endif } ios中DEBUG中记住用户名和密码,布布扣,bubuko.com

【转】ASP.NET Cookies简单应用 记住用户名和密码

不要试图给Password类型的TextBox赋值! 在asp.net中,不要试图给Password类型的TextBox控件赋值! 无论是在设计或是运行时,都不可以的.猜测的原因是,password类型的TextBox控件从根本上,没有Text属性的Set方法,只有Get !!同样,html中的Input控件,如果设置为ruanat="server",password类型的Input控件也是一样.无论是在设计或是运行时,都不容许设置它的值. 解决办法:txtPassword.Attri

Tortoisegit 记住用户名和密码

Tortoisegit 记住用户名和密码方法: [Windows系统] 当你配置好git后,在 C:\Documents and Settings\Administrator\ 目录下有一个  .gitconfig  的文件,里面会有你先前配好的name 和email,只需在下面加一行 [credential] helper = store 下次再输入用户名 和密码 时,git就会记住,从而在 C:\Documents and Settings\Administrator\  目录下形成一个  

Android 实现记住用户名和密码的功能

Android 实现记住用户名和密码的功能 结果演示: 源代码下载地址: https://github.com/GXS1225/Android-----.git 分析 (1)判断是否输入了账号和密码 if(name.trim().equals("")){ Toast.makeText(this, "请您输入用户名!", Toast.LENGTH_SHORT).show(); return; } if(pswd.trim().equals(""))

OpenVPN 如何记住用户名和密码

最近在使用OpenVPN,但是没有记住用户名和密码功能,太坑人,研究一下发现是可以的. 1. 在OpenVPN安装目录下\OpenVPN\config文件夹中找到vpnserver.ovpn文件. 2. 在文件最后一行加入auth-user-pass pass.txt保存. 3. 在同目录下创建pass.txt文件. 4. 文件中录入用户名和密码,用户名和密码独占一行.

通过jquery.cookie.js实现记住用户名、密码登录功能

<!doctype html>   <html xmlns="http://www.w3.org/1999/xhtml">   <head>   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   <title>无标题文档</title>   <script src="