Torando源代码分析实现XSRF保护Torando源代码分析实现XSRF保护Tornado开放XSRF保护的方法源代码分析xsrf_form_html ) )什么是self.xsrf_token
Tornado如何打开XSRF防护
3358 tornado-zh.readthedocs.io/zh/latest/guide/security.html
核心代码如下
Tornado打开xsrf_cookies
settings={ ' cookie _ secret ' : ' _ _ todo 3360 _ generate _ your _ own _ random _ value _ here _ ',' lore
formaction='/new _ message ' method=' post ' { % modulexsrf _ form _ html ()…/form源代码分析在上述代码中显而易见
xsrf_form_html ()是什么? 找到tornado目录,然后在该目录下通过linux命令找到xsrf_form_html
grep xsrf_form_html -r *查看grep结果,找到相关代码如下
defxsrf_form_html(self ) :返回类型=' hidden ' name=' _ xsrf ' value=' ' (escape.XHTML _ ESC allue )
self.xsrf_token用什么同样的方法找到xsrf_token
@propertydefxsrf_token(self ) :ifnothasattr ) self,' _xsrf_token ' ) : version,token, timestamp=self._ get _ raw _ xsrf _ token (output _ version=self.settings.get ) xsrf_cookie_version 2) csion { } if output _ version==1: self._ xsrf _ token=bin ascii.b2a _ hex (token ) elif output _ version===2333653650 ' binascii.B2A_hex ) _websocket_mask ) mask,token ) )、UTF8(str(int ) timestamp ) ] ) else 3360 raisevalueroror output _ version (ifversionisnone : expires _ days=30 if self.current _ userelsenoneself.set _ cookie (_ xsrf ' erenes ) **cookie_kwargs ) return self._xsrf_token其中@property是将这个类的函数设置为属性进行访问的装饰器
一定没有值_xsrf_token,就像首次访问一样
从代码中可以看出,token其实是self.xsrf_token的密钥
def_get_raw_xsrf_token(self ) :ifnotHasattr ) self,' _raw_xsrf_token ' ) : cookie=self.get tttr token,timestamp=None,None,noneiftokenisnone 3360 version=nonetoken=OS.urandom (16 ) timestamp=time.time ) )
如果是第一次生成token,则为
token=os.urandom(n(16 ) OS.urandom ) n )是随机生成n个字节的函数
所以,token是一个随机的16字节字符串
如果不是第一次的话。 从cookie获取token并将其放回前端
def_decode_xsrf_token(self,cookie ) : try : m=_ signed _ value _ version _ re.match (utf8 (cokie timestamp=cookie.split('|' ) mask=binascii.a2b_hex(UTF8 ) mask ) ) token=_websocket_ ) web bin ascii.a22 东京, timestamp else 3360 raise exception (unknownxsrfcookieversion ) ) else : version=1try : token=bin ascii.a2b _ hex ) ) ii.error,TypeError ) :Token=utf8(cookie ) timestamp=int(time.time ) ) return ) Version, token timestamp (except exception : gen _ log.debug (' uncaughtexceptionin _ decode _ xsrf _ token ',exc _ info=ttibon
当然,这里的“encode”和“decode”实际上只是在某种规则返回的token两侧添加了版本号和当前时间戳。