在web编程中,有时会有很多非主流的用法。比如用get方式来删除一个资源:
/localhost/ads/delete?id=123
这样很容易引入跨站攻击。 在tornado中,可以用系统的csrf检测机制规避一些风险。
在处理页面中,直接调用check_xsrf_cookie()
做跨站检测。
class AdminAdsDelete(BasicHandler):
def get(self):
self.check_xsrf_cookie()
id = int(self.get_argument("id", default=0))
...
因为后端做了检测,在index页面中,必须把csrf token传入到前端。可以用self.xsrf_token
获取这个token。
class AdminAdsIndex(BasicHandler):
def get(self):
...
self.render("admin/ads/index.html", ad_list=ad_list, xsrf_token=self.xsrf_token)
此时,在链接中,必须加入csrf token做get参数。否则在处理页check_xsrf_cookie()
会引发检测,造成403错误。
<span class="btn-del">
<a href="/admin/ads/delete?id={{item.id}}&_xsrf={{xsrf_token}}">删除</a>
</span>