tornado系列五:cookie安全
阿新 • • 發佈:2019-01-26
1、通過簽名防止cookie篡改
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.options
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self):
cookie = self.get_secure_cookie("count")
count = int(cookie) + 1 if cookie else 1
countString = "1 time" if count == 1 else "%d times" % count
self.set_secure_cookie("count", str(count))
self.write(
'<html><head><title>Cookie Counter</title></head>'
'<body><h1>You’ve viewed this page %s times.</h1>' % countString +
'</body></html>'
)
if __name__ == "__main__":
tornado.options.parse_command_line()
settings = {
"cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E="
}
application = tornado.web.Application([
(r'/', MainHandler)
], **settings)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
Tornado的set_secure_cookie()和get_secure_cookie()函式傳送和取得瀏覽器的cookies,以防範瀏覽器中的惡意修改。為了使用這些函式,你必須在應用的建構函式中指定cookie_secretTornado將cookie值編碼為Base-64字串,並添加了一個時間戳和一個cookie內容的HMAC簽名。如果cookie的時間戳太舊(或來自未來),或簽名和期望值不匹配,get_secure_cookie()函式會認為cookie已經被篡改,並返回None,就好像cookie從沒設定過一樣。cookie值是簽名的而不是加密的。
2、使用HTTP-Only和SSL Cookies屬性保證cookie安全
HTTP-Only屬性:禁止JavaScript訪問cookie
SSL Cookies屬性:指示瀏覽器只通過SSL連線傳遞cookie
用法:
self.set_cookie('foo', 'bar', httponly=True,
secure=True)
self.set_secure_cookie('foo',
'bar', httponly=True, secure=True)
3、防止cookie的跨站訪問攻擊
通過在應用的建構函式中包含xsrf_cookies引數來開啟XSRF保護:
settings = {
"cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=",
"xsrf_cookies": True
}
application = tornado.web.Application([
(r'/', MainHandler),
(r'/purchase', PurchaseHandler),
], **settings)
當這個應用標識被設定時,Tornado將拒絕請求引數中不包含正確的_xsrf值的POST、PUT和DELETE請求。Tornado將會在幕後處理_xsrf cookies,但你必須在你的HTML表單中包含XSRF令牌以確保授權合法請求。要做到這一點,只需要在你的模板中包含一個xsrf_form_html呼叫即可:
<form action="/purchase" method="POST">
{% raw xsrf_form_html() %}
<input type="text" name="title" />
<input type="text" name="quantity" />
<input type="submit" value="Check Out" />
</form>
AJAX請求也需要一個_xsrf引數
jQuery.postJSON = function(url, data, callback) {
data._xsrf = getCookie("_xsrf");
jQuery.ajax({
url: url,
data: jQuery.param(data),
dataType: "json",
type: "POST",
success: callback
});
}