Jonderwu 2019-06-28
上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第八节:用户身份认证
下一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及应用:第一节:WebSocket概念
跨站请求伪造(Cross-site request forgery,CSRF 或XSRF)是一种对网站的恶意利用。通过CSRF,攻击者可以冒用用户的身份,在用户不知情的情况下执行恶意操作。
下图展示了CSRF的基本原理。其中Site1是存在CSRF漏洞的网站,而SIte2是存在攻击行为的恶意网站。
上图内容解析如下:
<a href='http://www.site1.com/get_money?amount=500&dest_card=34XXXXX"> 三百万元抽奖,免费拿 </a>
为了防范CSRF攻击,要求每个请求包括一个参数值作为令牌的匹配存储在Cookie中的对应值。
Tornado应用可以通过一个Cookie头和一个隐藏的HTML表单元素向页面提供令牌。这样,当一个合法页面的表单被提交时,它将包括表单值和已存储的Cookie。如果两者匹配,则Tornado应用认可请求有效。
开启Tornado的CSRF防范功能需要两个步骤。
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字典的形式传入命名参数
<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内建的安全功能也非常有用。