在服务器端,成功登录后,执行:
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 :(得分:1)
你检查过你的饼干了吗?你是否真的将用户ID保存在cookie中,如果是,那该怎么办? 无法从客户端访问服务器端会话对象,这将是一个巨大的安全问题。
如果你的代码是正确的,那么使用哈希是没有理由或优势的。