tornado 学习之 cookie 验证机制详解

本文和大家分享的主要是tornado中cookie 验证机制相关内容,一起来看看吧,希望对大家 学习tornado有所帮助。

处理过程简单来说就是验证密码之后服务器端(tornado) 返回带有  cookie  信息的  Set-Cookie header 给客户端 ,  之后客户端发起请求时会把此  cookie  放入  Cookie header  中发给服务器端。

tornado 设置 cookie

首先是对 cookie  的变量进行设置 , Morsel  是含有几个特殊  key  的类似于  dict  的对象

def  set_cookie(self, name, value, domain=None, expires=None, path="/", expires_days=None):

if  not hasattr(self, "_new_cookie"):

self._new_cookie = Cookie.SimpleCookie()

self._new_cookie[name] = value

morsel = self._new_cookie[name]

if domain:

morsel["domain"] = domain

if expires_days  is  not  None  and  not expires:

expires = datetime.datetime.utcnow() + datetime.timedelta(

days=expires_days)

if expires:

morsel["expires"] = httputil.format_timestamp(expires)

if path:

morsel["path"] = path

然后将 cookie  的  header flush  给客户端

def  flush(self, include_footers=False, callback=None):

...

if hasattr(self, "_new_cookie"):

for cookie  in self._new_cookie.values():

self.add_header("Set-Cookie", cookie.OutputString( None))

...

return self.request.connection.write_headers(

start_line, self._headers, chunk, callback=callback)

...

torando 读取 cookie 并验证

tornado  从浏览器那获取  cookie  则特别简单,直接取出  header  中  Cookie  字段的内容 ,  然后解析一下

def  cookies(self):

if  not hasattr(self, "_cookies"):

self._cookies = Cookie.SimpleCookie()

if "Cookie"  in self.headers:

try:

parsed = parse_cookie(self.headers["Cookie"])

except Exception:

pass

else:

for k, v  in parsed.items():

try:

self._cookies[k] = v

except Exception:

pass

return self._cookies

以上代码就是 cookie  在  server  和浏览器中传递的过程 . 当然这只是简单的传递 ,  很容易找到规律并进行暴力破解进行提权攻击 .

tornado  提供了加密的  cookie, cookie  的传递还是上述代码 ,  唯一的不同是在服务端对  cookie  的 value  进行了加密 ,  这样用户即使知道其他用户的名字 ,  也无法在短时间内构造出一条正确的  cookie

tornado  在服务端需要自己定义一个  secret key.  一个加密的  cookie  的  value  由 (value, timestamp, signature)  三元组组成 ,  一般  value 可以通过加密算法构造 ,  而  timestamp  则直接可以从现有的  cookie  里面直接取 ,  所以最重要的是  signature  的构造 ,  由于用户不知道 secret. 所以用户无法通过算法构造出  signature,  只能窃取或者通过暴力破解 . 而 服务端则能够通过  cookie  确认  value  是正常的  value  且能够取出  value  里包含的信息

加密代码

def  create_signed_value(secret, name, value):

clock = time.time

timestamp = utf8(str(int(clock())))

value = base64.b64encode(utf8(value))

signature = _create_signature_v1(secret, name, value, timestamp)

value = b"|".join([value, timestamp, signature])

return value

def  _create_signature_v1(secret, *parts):

hash = hmac.new(utf8(secret), digestmod=hashlib.sha1)

for part  in parts:

hash.update(utf8(part))

return utf8(hash.hexdigest())

解密代码

def  _decode_signed_value_v1(secret, name, value, max_age_days, clock):

parts = utf8(value).split(b"|")

signature = _create_signature_v1(secret, name, parts[0], parts[1])

if  not _time_independent_equals(parts[2], signature):

return  None

clock = time.time

timestamp = int(parts[1])

if timestamp < clock() - max_age_days * 86400:

gen_log.warning("Expired cookie %r", value)

return  None

return base64.b64decode(parts[0])

def  _time_independent_equals(a, b):

for x, y  in zip(a, b):

result |= ord(x) ^ ord(y)

return result == 0

总结

函数 _time_independent_equals  是很讲究的。 它总是花费同样的时间去比较用户的输入和你计算的结果。比如用户想要暴力构造一些  session,  如果比较函数花费的时间和  signature  前面  n  字节是否正确正 ( 或者负 ) 相关。那么变更 signature,  通过大量查看延时 ,  理论上是能把  signature  暴力破解出来的 , 而这个  _time_independent_equals  可以防止这种攻击。

另外, tornado  这种校验  cookie  的方式能够天然解决  cookie  一致性的问题,可以方面的进行水平扩展。

来源: nosa.me

时间: 2024-10-13 11:33:04

tornado 学习之 cookie 验证机制详解的相关文章

Cookie/Session机制详解(转)

来源   http://blog.csdn.net/fangaoxin/article/details/6952954 ---------------------------- 转载过来学习用~ --------------------------- 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cook

Cookie/Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

【转载】Cookie/Session机制详解

[本文转自]http://blog.csdn.net/fangaoxin/article/details/6952954/ 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程

[转]Cookie/Session机制详解

本文转自:http://blog.csdn.net/fangaoxin/article/details/6952954/ 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序

【Cookie】Cookie/Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

如何区分不同用户——Cookie/Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

Cookie/Session机制详解(转载)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

浏览器缓存机制详解

对于浏览器缓存,相信很多开发者对它真的是又爱又恨.一方面极大地提升了用户体验,而另一方面有时会因为读取了缓存而展示了"错误"的东西,而在开发过程中千方百计地想把缓存禁掉.那么浏览器缓存究竟是个什么样的神奇玩意呢? 什么是浏览器缓存: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中.缓存会根据进来的请求保存输出内容的副本.当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是

J2EE学习篇之--JQuery技术详解

前面我们讲解了的J2EE的技术都是服务端的技术,下面我们来看一下前端的一些开发技术,这一篇我们来看一下jQuery技术 简介: jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. jQuery是继prototype之后又一个优秀的Javascript框架.其宗旨是--WRITE LESS,DO MORE,写更少的代码,做更多的事情. 它是轻量级的js库(压缩后只有21k) ,这是其它的js库所不及的,它兼容CSS3,还兼容各种浏