Python:Tornado 第二章:實戰演練:開發Tornado網站:第九節:防止跨站攻擊

上一篇文章:Python: Tornado 第二章:實戰演練:開發Tornado網站:第八節:用戶身份認證
下一篇文章: Python:Tornado 第三章:HTML5 WebSocket概念及應用:第一節:WebSocket概念

跨站請求僞造(Cross-site request forgery,CSRF 或XSRF)是一種對網站的惡意利用。經過CSRF,攻擊者能夠冒用用戶的身份,在用戶不知情的狀況下執行惡意操做。html

一、CSRF攻擊原理

下圖展現了CSRF的基本原理。其中Site1是存在CSRF漏洞的網站,而SIte2是存在攻擊行爲的惡意網站。web

圖片描述
上圖內容解析以下:segmentfault

  • 用戶首先訪問了存在CSRF漏洞網站Site1,成功登錄並獲取了Cookie,此後,全部該用戶對Site1的訪問均會攜帶Site1的Cookie,所以被Site1認爲是有效操做。
  • 此時用戶又訪問了帶有攻擊行爲的站點Site2,而Site2的返回頁面中帶有一個訪問Site1進行惡意操做的鏈接,但卻假裝成了合法內容,好比下面的超連接看上去是一個抽獎信息,實際上倒是想Site1站點提交提款請求
<a href='http://www.site1.com/get_money?amount=500&dest_card=34XXXXX">
三百萬元抽獎,免費拿
</a>
  • 用戶一旦點擊惡意連接,就在不知情的狀況下向Site1站點發送了請求。由於以前用戶在Site1進行過登錄且還沒有退出,因此Site1在收到用戶的請求和附帶的Cookie時將被認爲該請求是用戶發送的正常請求。此時,惡意站點的目的也已經達到。

二、用Tornado防範CSRF攻擊

爲了防範CSRF攻擊,要求每一個請求包括一個參數值做爲令牌的匹配存儲在Cookie中的對應值。安全

Tornado應用能夠經過一個Cookie頭和一個隱藏的HTML表單元素向頁面提供令牌。這樣,當一個合法頁面的表單被提交時,它將包括表單值和已存儲的Cookie。若是二者匹配,則Tornado應用承認請求有效。cookie

開啓Tornado的CSRF防範功能須要兩個步驟。app

【1】在實例化tornado.web.Application時傳入xsrf_cookies=True參數,即:
application=tornado.web.Application([
(r'/',MainHandler),
],
cookie_secret='DONT_LEAK_SECRET',
xsrf_cookies=True,
)

或者:框架

settings={
"cookie_secret":"DONT_LEAK_SECRET",
"xsrf_cookies":True
}

application=tornado.web.Application([
(r'/',MainHandler),
],**settings)
當tornado.web.Application須要初始化的參數過多時,能夠像本例同樣經過setting字典的形式傳入命名參數
【2】在每一個具備HTML表達的模板文件中,爲全部表單添加xsrf_form_html()函數標籤,好比:
<form action="/login" method="post">
{% module xsrf_form_html() %}
<input type="text" name="message"/>
<input type="submit" value="Post"/>
</form>

這裏的{% module xsrf_form_html() %}起到了爲表單添加隱藏元素以防止跨站請求的做用。函數

Tornado的安全Cookie支持和XSRF防範框架減輕了應用開發者的不少負擔,沒有他們,開發者須要思考不少防範的細節措施,所以Tornado內建的安全功能也很是有用。tornado

相關文章
相關標籤/搜索