当构建CS模式的应用程序时,在client側存储敏感信息(比如用户私要信息)可能导致非授权的信息泄漏。

对于Web应用程序来说,最常见的泄漏问题是在client使用cookies存放server端获取的敏感信息。Cookies是由webserver创建的,它具有一个指定的有效时间,保存在client。当client连接上server端时,client使用cookies中存储的信息向server端进行认证,通过后server端返回敏感信息。

在XSS攻击下,Cookies不能保证敏感信息的安全。不管是通过XSS攻击,还是直接对client的攻击,攻击者一旦获取到Cookies,他就能够使用这个Cookies从server端获取敏感信息。上面的风险存在时间窗,当Cookies存活超过指定的时间后(比如15分钟),server端会使会话无效,这时风险就不存在了。

Cookies是一个短的字符串,假设它包括了敏感的信息,那么这段信息必须进行加密,敏感信息包括username,password,信用卡号码,社会安全码,以及其它不论什么个人标识信息。关于管理password的很多其它细节,參见“#13使用散列函数来存储password”。关于怎样保证内存中敏感信息安全的很多其它细节,參见“#01限制内存中敏感数据的生命周期”。



[不符合安全要求的代码演示样例]

以下的代码中,login servlet将username和password存储在Cookies中,用于兴许请求中标识用户。

	protected void doPost(HttpServletRequest request, HttpServletResponse response) {

		// validate input (omitted)

		String username = request.getParameter("username");
char[] password = request.getParameter("password").toCharArray();
boolean rememberMe = Boolean.valueOf(request.getParameter("rememberme")); LoginService loginService = new LoginServiceImpl();
if (rememberMe) {
if (request.getCookies()[0] != null &&
request.getCookies()[0].getValue() != null) {
String[] value = request.getCookies()[0].getValue().split(";"); if (!loginService.isUserValid(value[0], value[1].toCharArray())) {
// set error and return
} else {
// forward to welcome page
}
} else {
boolean validated = loginService.isUserValid(username, password);
if (validated) {
Cookie loginCookie = new Cookie("rememberme", username + ";" + new String(password));
response.addCookie(loginCookie); // forword to welcome page
} else {
// set error and return
}
}
} else {
// no remember-me functionality selected
// process with regular authentication;
// if it fails set error and return
}
Array.fill(password, ' ');
}

上面代码中实现“记住我”功能的方法不安全的,由于当攻击者能够訪问client电脑时,他能够直接获取这些敏感信息。上面代码同一时候违背了“#13使用散列函数来存储password”。



[符合安全要求的解决方式-会话]

以下代码以一种安全的方式实现“记住我”功能,它将username和一个安全的随机字符串存储在Cookie中,同一时候使用HttpSession来保存会话状态。

	protected void doPost(HttpServletRequest request, HttpServletResponse response) {

		// validate input (omitted)

		String username = request.getParameter("username");
char[] password = request.getParameter("password").toCharArray();
boolean rememberMe = Boolean.valueOf(request.getParameter("rememberme")); LoginService loginService = new LoginServiceImpl();
boolean validated = false;
if (rememberMe) {
if (request.getCookies()[0] != null &&
request.getCookies()[0].getValue() != null) {
String[] value = request.getCookies()[0].getValue().split(";"); if (value.length != 2) {
// set error and return
} if (!loginService.mappingExists(value[0], value[1])) {
// (username random) pair is checked
// set error and return
} else {
validated = loginService.isUserValid(username, password);
if (!validated) {
// set error and return
}
} String newRandom = loginService.getRandomString();
// reset the random every time
loginService.mapUserForRememberMe(username, newRandom);
HttpSession session = reuqest.getSession();
session.invalidate();
session = request.getSession(true); // set session timeout to 15 minutes
session.setMaxInactiveInterval(60*15); // store user attribute and a random attribute in session scope
session.setAttribute("uset", loginService.getUsername());
Cookie loginCookie = new Cookie("rememberme", username + ";" + newRandom);
response.addCookie(loginCookie); // forword to welcome page
}
} else {
// no remember-me functionality selected
// process with regular authentication;
// if it fails set error and return
}
Array.fill(password, ' ');
}

server端保存username和安全随机字符串的映射关系,当用户选择“记住我”时,doPost()函数检查client提供的Cookies中是否包括有效的username和随机字符串映射对。假设映射对是正确的,server端通过该用户的认证,并使用户跳转到欢迎页。假设认证没有通过,server端返回错误给client。假设用户选择“记住我”,但客户度没有有效的Cookie导致认证失败,那么server端会要求用户使用认证信息又一次进行认证。假设认证成功,server端会提供一个包括新的“记住我”特性的Cookie给client。

这个解决方式通过使当前会话无效并创建新的会话,能够避免固定会话攻击。同一时候通过将会话訪问有效时间设置为15分钟来将降低攻击者实施会话劫持攻击的时间窗长度。

——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人允许请勿用于商业用途,谢谢——

【Java编码准则】の #02不要在client存储未加密的敏感信息的更多相关文章

  1. 【Java编码准则】の #12不要使用不安全或者强度弱的加密算法

    安全性要求高的应用程序必须避免使用不安全的或者强度弱的加密算法,现代计算机的计算能力使得攻击者通过暴力破解能够攻破强度弱的算法.比如,数据加密标准算法DES是极度不安全的,使用类似EFF(Electr ...

  2. 【Java编码准则】の #13使用散列函数保存password

    明文保存password的程序在非常多方面easy造成password的泄漏.尽管用户输入的password一般时明文形式.可是应用程序必须保证password不是以明文形式存储的. 限制passwo ...

  3. 【Java编码准则】の #11不要使用Object.equals()来比較密钥值

    java.lang.Object.equals()函数默认情况下是不能用来比較组合对象的,比如密钥值.非常多Key类没有覆写equals()函数,因此,组合对象的比較必须单独比較里面的各个类型以保证正 ...

  4. 【Java编码准则】の #01限制内存中敏感数据的生命周期

    当竞争对手的应用程序与我们的应用程序执行在同一个系统上时,我们的应用程序在内存中的敏感数据是非常easy被竞争对手获取的.假设我们的应用程序符合以下几种情况之中的一个,那么竞争对手能够获取到我们应用的 ...

  5. idea安装 阿里巴巴Java编码准则插件

    首先还是打开熟悉的idea 在marketplace 输入 alibaba 我这是已经安装过了 下载完成之后重启idea生效 如果需要那就手动的扫描 当然已经自动的扫描了 如果你的代码不符合阿里的标准 ...

  6. 【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息

    本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+infor ...

  7. 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码

    015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...

  8. 013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储

    013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储 变量和它的值如何在内存中进行存储的? 前面学习过:Java中的数据类型分为基本 ...

  9. 017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例

    017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例 本文知识点:变量 相同类型的变量可以一次同时定义多个 例:可以一行代码同时定义2个变量x ...

随机推荐

  1. HDU 3177 Crixalis's Equipment(贪婪)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=3177 Problem Description Crixalis - Sand King used t ...

  2. 《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息

    这一次,琢磨了一下Unity3D网络游戏发展的网络信息处理.服务器的网络游戏一般都是自主研发,因此,相应的网络消息处理应该培养自己.client/现在使用的邮件服务器之间的价差JSON和Google. ...

  3. Nim博弈游戏

    给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败 对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败 设先手胜的局势为N-postion,先手败的局势为P-pos ...

  4. mysql按ID排序(转)

    自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为int(2)的. 因为我只允许输出数字.这本来也没什么,无非就是占点空间,懒得改了.但是今天在后台发现排序有问题.于是,没办法, ...

  5. erlang shell表格数据对齐

    近期在erlang shell做一些測试,为了让測试结果数据显得更直观,想对齐须要打印的数据,做成像表格一样的效果. 開始的想法是在数据中插入tab. 当然,erlang也有对tab的支持,但实际效果 ...

  6. Android实现限制EditText输入文字的数量

    一: 声明控件.          TextView hasnumTV;         TextView hasnum;// 用来显示剩余字数         int num = 50;// 限制的 ...

  7. session与cookie的差别

    session     session 的工作机制是:为每一个訪客创建一个唯一的 id (UID),并基于这个 UID 来存储变量.UID 存储在 cookie 中,或者通过 URL 进行传导.   ...

  8. hadoop 提高hdfs删文件效率----hadoop删除文件流程解析

    前言 这段时间在用hdfs,由于要处理的文件比较多,要及时产出旧文件,但是发现hdfs的blocks数一直在上涨,经分析是hdfs写入的速度较快,而block回收较慢,所以分心了一下hadoop删文件 ...

  9. effective c++ prefer const,enum, inline to #defines

    学习心得 对于纯常量,最好以const对象或者enums替换#define #define FIRST 3 //not good enum { first=1, second=2 } ; int nu ...

  10. RH033读书笔记(2)-Lab 3 Getting Help with Commands

    Lab 3 Getting Help with Commands Sequence 1: Using the Help Tools 1. man -f keyword whatis keyword l ...