“CSRF”的英文全称是:“Cross-Site Request Forgery”,翻译过来就是:“跨站请求伪造”。
那么什么是跨站伪造请求攻击呢?看下面这张图就够了。
注意:看上面这张图请按图中标注的1到6的顺序阅读。
Django通过引入CSRF令牌机制就可以有效的防止这种CSRF攻击。
来看下面一段HTML模板代码:
<form method="POST">
{% csrf_token %}
<input type="text" name="username" >
<input type="submit" value="提交">
</form>
这段代码中的 {% csrf_token %}
就是Django实现防CSRF攻击的语句,解释如下:
在Django的模板中,{% csrf_token %}
是一个模板标签,用于生成一个CSRF(Cross-Site Request Forgery)令牌。CSRF是一种攻击方式,攻击者通过伪造用户的请求来执行恶意操作。
CSRF令牌是一种安全机制,用于防止CSRF攻击。当用户使用表单时,Django会生成一个唯一的令牌并将其嵌入到生成的表单中。这个令牌由{% csrf_token %}
标签生成,并在模板渲染时插入到表单的隐藏字段中。
在用户填写好表单并提交表单时,Django会验证请求中的CSRF令牌与服务器端保存的令牌是否匹配。如果不匹配,Django将拒绝该请求,从而防止CSRF攻击。
因此,{% csrf_token %}
标签在表单中起到了保护应用程序免受CSRF攻击的作用。
总结:
CSRF令牌一般是传输到 HTML 表单中隐藏字段中的客户端,并使用 HTTP POST 请求提交。
关于HTTP POST的知识,请参考链接:https://blog.csdn.net/wenhao_ir/article/details/131307238
通过上面的CSRF令牌存储和提交机制,虽然攻击者可以因为用户在同一浏览器中没有退出A网站而利用到用户的cookie信息(请注意:攻击者只是能用利用到用户的cookie信息,实际上并没有拿到用户的cookie值,为什么没拿到?请结合本文开头的那幅对CSRF攻击介绍的图仔细理解),但是因为CSRF令牌值是存储在页面的隐藏字段中并且通过 HTTP POST 请求提交,所以攻击者是获取不到这个CSRF令牌值的。这样即使攻击者在request中添加了提交表单的数据,由于攻击者没有正确的CSRF令牌值,那么攻击者还是无法完成自己想要的提交成功数据的效果。