Django 之csrf防护原理

image.png

什么是csrf伪造

举例子来说,当你登录一个网站时,填好数据点击发送后,网站会处理这个request,在后台存储一份关于你登录的一些信息,比如用户名、密码、登录时间、登录IP等,这些数据存储在服务器后台,即所谓的session。待登录相关的逻辑处理完毕后,除了给你返回登陆后的页面, 还会捎带一些cookie,其中就有唯一标识后台session的session_id(大多数是这个名字)。浏览器把cookie缓存在本地,这样后面再访问那个网站时,浏览器把这份cookie放在request的头部,服务器收到后按session-id到后台去找你的信息,发现你来过,就直接把页面给你了,免去登录的步骤。
从上面看出,免登陆的关键在cookie,而危险也出在cookie上。
跨站请求伪造指的就是第三方网站事先设计一个指向你登录过的目标网站的连接,然后在诱饵网站(hook site)上想方设法让你点击那个连接,甚至通过AJAX偷偷地发起请求,这样浏览器就会携带已有的cookie向目标网站发送信息,万一这个请求中携带某些操作,比如转账、改库存啥的,那就惨了。

Django的csrf

Django默认启用csrf防护,只针对使用POST方式的请求
做法是:
在表单部分加上{% csrf_token %}。这个语句的效果是在表单的源代码上生成一个的隐藏域。
防护原理也很好理解:

  1. {% csrf_token %}被渲染成一个隐藏域
  2. 服务器将渲染后的表单返回给浏览器同时,把一个包含csrftoken的cookie异同传给用户。
  3. 用户点击提交后,服务器对比表单隐藏域和cookie中的值,如果一样说明是通过本站登录而来的

你可能感兴趣的:(Django 之csrf防护原理)