1、xsrf概念html
xsrf 中文名稱爲跨站請求僞造,也被稱爲csrf(Cross-site request forgery)。因爲目標站無token/referer限制,致使攻擊者能夠用戶的身份完成操做達到各類目的。web
hyddd(陳曦明)的文章很詳細地描述了這種攻擊的發起方式:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html ajax
2、Tornado Web防止xsrf攻擊的方式json
Tornado Web服務器從設計之初就在安全方面有了不少考慮,使其可以更容易地防範那些常見的漏洞。安全
開啓防止xsrf攻擊方式的方法很簡單,首先在應用的構造函數中包含xsrf_cookies參數來開啓XSRF保護:服務器
settings = { "cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=", "xsrf_cookies": True } application = tornado.web.Application([ (r'/', MainHandler), (r'/purchase', PurchaseHandler), ], **settings)
當xsrf_cookies的值爲true時,Tornado將拒絕請求參數中不包含正確的_xsrf值的POST、PUT和DELETE請求,即你必須在每次的post、put、delete請求中添加_xsrf參數。form表單和ajax請求的實現分別以下:cookie
<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>
function getCookie(name) {
var c = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return c ? c[1] : undefined;
}
jQuery.postJSON = function(url, data, callback) {
data._xsrf = getCookie("_xsrf");
jQuery.ajax({
url: url,
data: jQuery.param(data),
dataType: "json",
type: "POST",
success: callback
});
}
在使用xsrf_form_html時XSRF的cookie自動被設置,可是若是你的應用程序所有使用ajax的請求方式,則還需添加 self.xsrf_token ,不然cookie("_xsrf")的值會爲undefined。app
可重寫一個BaseHandler實現。函數
class BaseHandler(tornado.web.RequestHandler): def __init__(self, *argc, **argkw): self.xsrf_token