做过android的朋友可能会发现手机的app与服务器接口之间的数据交换是非常频繁的,在JAVA-WEB中前台界面与服务器之间有一个安全机制session,它的存在可以过滤掉很多非登陆状态的请求,那如何才能保证普通的移动终端ios或是android端的请求时合法有效的呢,下面我总结也尝试了几种方式,当然不管哪一种机制,都有其弊端,也不是绝对安全的,只能说比不进行任何处理要好的多。
1.请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。
有点:防止了服务器端api被随意调用。
缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。
2.第一次请求,要求username和password,验证通过,种cookie到客户端,app保存cookie值。
每次请求带上cookie。
点评:和pc上浏览器认证的原理一样了。
以上两点,只有注册用户,才能有权访问业务逻辑,而app有大量的不需要注册数据api
3.制定一个token生成规则,按某些服务器端和客户端都拥有的共同属性生成一个随机串,客户端生成这个串,服务器收到请求也校验这个串。
缺点:随机串生成规则要保密。
比如:一个使用php框架的工程,框架每次交互都会有 module和action两个参数做路由,这样的话,我就可以用下边这个规则来生成token
app要请求用户列表,api是“index.do?module=user&action=list”
app生成token = md5sum ('user'.'2012-11-28'.'#$@%!'.list) = 880fed4ca2aabd20ae9a5dd774711de2;
实际发起请求为 “index.php?module=user&action=list&token=880fed4ca2aabd20ae9a5dd774711de2”
服务器端接到请求用同样方法计算token,当然你可以自己封装一下Md5算法。
当然,上面的三种方法都是行之有效,但是被反编译后,还是逃不过hack app的攻击,还有一种方式就是类似浏览器与服务器的通信一样,模拟出session。
4.
原因很简单,就是因为android手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。不过有很多android程序的请求,会直接用其他框架的请求方式像常见的volley等等。那样处理起来就不方便了。
以java.net.HttpURLConnection发起请求为例:
获取Cookie:
URL url = new URL(requrl);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
// 取得sessionid.
String cookieval = con.getHeaderField("set-cookie");
String sessionid;
if(cookieval != null) {
sessionid = cookieval.substring(0, cookieval.indexOf(";"));
}
//sessionid值格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是键值对,不是单指值
发送设置cookie:
URL url = new URL(requrl);
HttpURLConnectioncon= (HttpURLConnection) url.openConnection();
if(sessionid != null) {
con.setRequestProperty("cookie", sessionid);
}
只要设置了sessionID,这样web服务器在接受请求的时候就会自动搜索对应的session了,从而保证了在同一会话Session。