【Java编码准则】の #02不要在client存储未加密的敏感信息
当构建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存储未加密的敏感信息的更多相关文章
- 【Java编码准则】の #12不要使用不安全或者强度弱的加密算法
安全性要求高的应用程序必须避免使用不安全的或者强度弱的加密算法,现代计算机的计算能力使得攻击者通过暴力破解能够攻破强度弱的算法.比如,数据加密标准算法DES是极度不安全的,使用类似EFF(Electr ...
- 【Java编码准则】の #13使用散列函数保存password
明文保存password的程序在非常多方面easy造成password的泄漏.尽管用户输入的password一般时明文形式.可是应用程序必须保证password不是以明文形式存储的. 限制passwo ...
- 【Java编码准则】の #11不要使用Object.equals()来比較密钥值
java.lang.Object.equals()函数默认情况下是不能用来比較组合对象的,比如密钥值.非常多Key类没有覆写equals()函数,因此,组合对象的比較必须单独比較里面的各个类型以保证正 ...
- 【Java编码准则】の #01限制内存中敏感数据的生命周期
当竞争对手的应用程序与我们的应用程序执行在同一个系统上时,我们的应用程序在内存中的敏感数据是非常easy被竞争对手获取的.假设我们的应用程序符合以下几种情况之中的一个,那么竞争对手能够获取到我们应用的 ...
- idea安装 阿里巴巴Java编码准则插件
首先还是打开熟悉的idea 在marketplace 输入 alibaba 我这是已经安装过了 下载完成之后重启idea生效 如果需要那就手动的扫描 当然已经自动的扫描了 如果你的代码不符合阿里的标准 ...
- 【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息
本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+infor ...
- 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码
015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...
- 013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储
013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储 变量和它的值如何在内存中进行存储的? 前面学习过:Java中的数据类型分为基本 ...
- 017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例
017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例 本文知识点:变量 相同类型的变量可以一次同时定义多个 例:可以一行代码同时定义2个变量x ...
随机推荐
- 神经网络BP算法C和python代码
上面只显示代码. 详BP原理和神经网络的相关知识,请参阅:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输 ...
- 运行一个android程序,直接访问某个网站
package android.com.youtube; import android.app.Activity; import android.content.Intent; import andr ...
- hdu 4107当卡段树
其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历:否则,就往子树递归. #include<iostream> #in ...
- VS2010关于error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
前段时间自己的系统一直在安装更新.今天突然打开VS2010当运行的时候一直出现error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏这种错误.然后就百度 解决的方法: 1.项目\属 ...
- hdu3873 有约束条件的最短路
题目大意:美国佬打算入侵火星,火星上有n个城市,有些城市可能受其他城市保护, 如果i城市受j城市保护,那么你必须先攻占j城市才能再攻占i城市,问你攻占城市n的最短时间是多少. 数据解释: 给定t, 表 ...
- spring 重定向以及转发 乱码问题解决
1.spring 转发 request.setAttribute("id", id); request.setAttribute("name",name); r ...
- HDU4870:Rating(DP)
Problem Description A little girl loves programming competition very much. Recently, she has found a ...
- ASP.NET执行循序
首先第一次运行一个应用程序(WebSite或者WebApplication都是Web应用程序)第一次请求 -> 1,IIS -> 2,aspnet_isapi(非托管dll) -> ...
- RH033读书笔记(7)-Lab 8 Introduction to String Processing
Lab 8 Introduction to String Processing Sequence 1: Exercises in string processing 1. Other than the ...
- cocos2dx环境配置和打包
安装软件准备就绪: vs2012 cocos2d-x-2.2.1 adt-bundle-windows-x86_64-20121030 android-ndk-r9c-windows-x86_64 j ...