1. 程式人生 > >tornado系列五:cookie安全

tornado系列五:cookie安全

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_secret
引數。  

Tornado將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值的POSTPUTDELETE請求。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
    });
}