tornado模板引擎語法

2021-07-31 09:45:59 字數 3778 閱讀 4264

學習tornado

有所幫助。

處理過程簡單來說就是驗證密碼之後伺服器端(tornado) 返回帶有  cookie  資訊的  set-cookie header 給客戶端 ,  之後客戶端發起請求時會把此  cookie  放入  cookie header  中發給伺服器端。

tornado 設定 cookie

首先是對 cookie  的變數進行設定 , morsel  是含有幾個特殊  key  的類似於  dict  的物件

然後將 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.******cookie()

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, times**p, signature)  三元組組成 ,  一般  value 可以通過加密演算法構造 ,  而  times**p  則直接可以從現有的  cookie  裡面直接取 ,  所以最重要的是  signature  的構造 ,  由於使用者不知道 secret. 所以使用者無法通過演算法構造出  signature,  只能竊取或者通過暴力** . 而 服務端則能夠通過  cookie  確認  value  是正常的  value  且能夠取出  value  裡包含的資訊

加密**

def  create_signed_value(secret, name, value):

clock = time.time

times**p = utf8(str(int(clock())))

value = base64.b64encode(utf8(value))

signature = _create_signature_v1(secret, name, value, times**p)

value = b"|".join([value, times**p, 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

times**p = int(parts[1])

if times**p < 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  一致性的問題,可以方面的進行水平擴充套件。

KendoUI模板引擎 號語法

kendoui的模板引擎使用的語法叫做 號語法 hash syntax 主要用來完成兩件事情 渲染資料和執行js表示式。uses var mytemplateraw kendo.template name var newhtmlraw mytemplateraw console.log newhtm...

tornado入門 模板

繼承與重寫 error this text is not shown 其他用法 自帶linkify 將在頁面顯示鏈結 自定義方法 在handler裡定義函式,新增到self.ui字典 class homehandler tornado.web.requesthandler def test stri...

tornado模板搭建

開啟cmder,建立乙個目錄,把專案clone下來。windows環境下,用 python3.8作為直譯器比較麻煩,需要在檔案中新增一些配置才能把torado執行起來,這個在官方檔案裡頭有說明。所有這邊用python3.6的版本來建立。首先在window環境配置中,把python3.6的配置移動到p...