學習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...