web安全中的cookie欺骗以及session的安全性
in Web on javascript, web, 前端, 安全 - Hits()
通过这篇文章,可以发现通常所用的session,cookie多么的不安全!但是也不要杯弓蛇影,关键是要依据情景来制定策略!
session fixation attacks(固定session攻击)
就是要注意,cookie是可以被客户端改动的,也可能客户端开启了第三方cookie,也是可能被窃听的。
那么什么情况下会被入侵:
信任cookie的值:例如用其(固定的值)直接作为登陆凭证,例如被它做了sql注入--安全的做法是:cookie保存随机值,或是加密的用户名密码。你也许会想,加密的用户名密码还不是可以放到修改的cookie里面--是的,但是hackerr怎么得到这个用户名密码?一:它安装木马---这个就不是web程序的原因了,要怪就怪用户自己染上木马。二:用户自己就是hacker,有这个程序的用户名密码--那还费什么劲搞hack,直接输入用户名密码登陆不就得了。(我就是犯了这个牛角尖)
未经加密的http通信中cookie和基于cookie的session都是不安全的,不要用cookie存储机密信息。sessionid这类机密信息应该设置为安全,cookie.setSecure(true);可惜java servlet是没有设置jsession为true的。
不过可以这样:
final HttpSession session = httpRequest.getSession(false); if (session != null) { final Cookie sessionCookie = new Cookie("JSESSIONID", session.getId()); sessionCookie.setMaxAge(-1); sessionCookie.setSecure(false); sessionCookie.setPath(httpRequest.getContextPath()); httpResponse.addCookie(sessionCookie); }
话说回来,一个没有使用ssl的站点,加密cookie又有什么用呢?即使监听者获取不了jsessionid之类的cookie,但是他可以看到明文的http内容,他就不需要去猜什么用户名密码之类的。
这样说来还是看安全定位,确实很重要的传输,还是使用ssl吧。
在ssl中还要注意sessionid的安全性:
- 一些程序在一些HTTP页面就发送一个令牌,然后再登录页面开始使用https,并且登录时也不修改此令牌,结果最初并未通过验证的用户会话在登录后被升级为通过验证的会话。窃听者可以在登录前就拦截到这个令牌。所以为了提高安全性,程序可以在登录的时候发送令牌或发送一个新令牌。
- 程序容许通过HTTP登录,如果攻击者成功将用户的链接降级为HTTP,他仍然能够拦截这个令牌。
- 如果所有的页面都是用HTTPS,但图片和一些js,css等的静态文件是使用HTTP传输。这时如果静态文件和登录等页面时在同一个域下,令牌也会通过HTTP泄露。所以将静态文件使用别的域好处是很多的。
CAS的TGC(cookie)还是要配合SSL来保证安全的(这样看来CAS这方面还是有缺陷。),它的TGC一旦被窃听,就会被利用。
总结一下,一般没有加密的http内容都是可以被窃取的,这种情况下,session,cookie,内容等都不是安全的。如果想要提高安全,就是用ssl吧,无论从经济,技术复杂度,架构复杂度来说,都是划算的。但是不是使用了ssl就万事大吉,仍然需要做些防范来保证session令牌的安全性。
参见文章:
安全的session管理 http://blog.ureshika.com/archives/500.html
session 和 cookie 到底有什麼差別?安全性 http://bbbb7787.blogspot.com/2010/10/session-cookie.html
提高session的安全性(这是对《黑客攻防技术宝典-web实战篇》一书的概括,建议看看这本书) http://hi.baidu.com/billdkj/blog/item/e72ce5257cf93d6b35a80fc2.html