关于移动开发接口的安全性

做过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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章