2014-01-19 80 views
0

在服务器端,成功登录后,我执行:Servlet的会话cookie篡改和安全

HttpServletRequest request = this.getThreadLocalRequest(); 
HttpSession session = request.getSession(); 
session.setAttribute("user", subject.getUser().getId()); 
session.setAttribute("logged", true); 

我再假设该用户登录当用户导航到一个安全的网页,以。保存或删除我的数据库中的记录,我运行此代码。

HttpServletRequest request = this.getThreadLocalRequest(); 
HttpSession session = request.getSession(); 
if (session.getAttribute("user")!=null && session.getAttribute("logged")) 
{ 
    //delete a record using the authority of the user. 
} 

我担心的是客户端可以用不同的用户ID来篡改浏览器cookie。数据库请求将以不同的用户启动,跳过登录过程。

Java会话能识别篡改,或者我应该用数字包括该行

session.setAttribute("signature", hash(secretkey + subject.getUser().getId()); 

然后验证签名更改数据库之前有效签署了会议。

if (session.getAttribute("signature").equals(hash(secretkey + session.getAttribute("user")) 
{ 
    //delete a record using the authority of the user. 
} 
+0

即使您对Java会话如何工作的假设是错误的(正如下面的答案中所解释的),我赞赏你对安全性的看法。你绝对不应该相信客户发给你的任何东西。 –

回答

1

你检查过你的饼干吗?你是否真的把用户ID保存在一个cookie中,如果是的话,为了什么? 无法从客户端访问服务器端会话对象,这将是一个巨大的安全问题。

如果你的代码是正确的,那么使用散列没有任何理由或优势。

+0

所以,java会话只在客户端存储一个小字符串。这样的字符串用于检索服务器端的所有存储对象? –

+0

是的,就像一个HashMap的关键。 – Kayaman